finde wert in liste

Hallo Forum,

Ich habe eine Tabelle “Prozess”, die in einem Feld einen String mit kommaseparierten Werten enthält.
In einer anderen Tabelle “Objekte” habe ich ein Feld mit einem String, der Teilstring in dem Feld der oben genannten Tabelle Prozess ist.

Beispiel

Tabelle Prozess:

id,name,import_ids
 1,'p_eins','1864,2031,1899'
 2,'p_zwei','30,40,31,85'
...
etc.



Tabelle Objekte:

id,name,import_id,prozess_id
 1,'o_eins','1864',null
 2,'o_zwei','31',null
...
etc.

Nun möchte ich gerne jedes Objekt einem Prozess zuordnen (Spalte prozess_id). Geschehen soll das über die Spalten import_ids (Prozess) und import_id(Objekt).

Meine Versuche mittels LIKE einfach in der Idliste des Prozesses zu suchen waren nur zum Teil von Erfolg gekrönt, da z.B. die Objekt-import_id:31 auch in dem String 2031 zu finden ist, was natürlich in meinem Fall hinderlich ist.
Weitere Versuche, die Liste in einen Array umzuwandeln und dann mittels ALL/ANY im Array zu suchen scheiterten wohl an meinen unzureichenden SQL Fähigkeiten.

select id
from
 objekt
where 
 [b]import_id[/b] = ALL (
select
  string_to_array ([b]import_ids[/b],',')
from 
 Prozess
)

Zum einen gibt es einen Fehler
Error: Operator does not exist:character varying = text[]
zum anderen zäumt mir der Ansatz das Pferd ja von hinten auf; ich bekomme die aktuelle Id vom Objekt und nicht von Prozess geliefert.

Wie kann meine generelle Vorgehensweise jetzt sein? Sollte ich eine Funktion schreiben, die mir diese Funktionalität bereitstellt? Oder geht das mit Bordmitteln? Es muss auch nur einmal funktionieren, Performance ist egal, es sind auch nur ein paar Hundert Objekte.

Hi Frabron,

du hast doch die IDs schön mit Kommata getrennt, die kannst du doch bei der Suche mit LIKE verwenden

SELECT o.id, p.id 
  FROM Objekte o, Prozesse p 
  WHERE p.import_ids LIKE '%,' || o.id || ',%'
    OR p.import_ids LIKE o.id || ',%'
    OR p.import_ids LIKE '%,' || o.id;

CU
Fröstel

Ähm, dein Problem ist ein sehr sehr gutes Zeichen dafür, das deinem Datenmodell eine vernünftige Normalisierung fehlt.

Vielleicht solltest du darüber nachdenken, deine Tabellen etwas umzustellen. Dann klappt das auch mit den gewünschten Anfragen.

@fröstel
Gute Idee, das Like statement so zu kreieren, das werde ich gleich mal austesten :slight_smile:

@ads:
Die Daten stammen aus einer nicht normalisierten Filemaker Datenbank und werde gerade in eine (hoffentlich) normalisierte importiert. Zwischen Prozess und Objekt besteht eine 1:n Beziehung, die über die oben genannten Felder hergestellt werden soll. Zur Zeit liegen die Daten halt als CSV - Import in meiner Postgres Datenbank und wollen auf die richtigen Tabellen und Felder verteilt werden.

das ist (nur für das Archiv) fast richtig, man muss die Leerzeichen nach den Kommata beachten, also

SELECT o.id, p.id 
  FROM Objekte o, Prozesse p 
  WHERE p.import_ids LIKE '%, ' || o.id || ',%'
    OR p.import_ids LIKE o.id || ',%'
    OR p.import_ids LIKE '%, ' || o.id;