auch null-Werte mit Wildcard selectieren

Hallo,

ich habe das Folgendes Problem ich habe eine in der Datenbank eine Artikel-Tabelle und eine Tabelle mit Ausnahmen, anhand der die Artikeltabelle geprüft wird und nochmal ein kennzeichen gesetzt wird (das funktioniert per Update).

Die Tabelle mit den Ausnahmen hat 4 Felder, die die entsprechenden Kriterien enthalten. Allerdings kann es vorkommen, dass in der Ausnahmentabelle z.B. nur Feld1 und Feld2 relevant sind. Deshalb arbeite ich im Update Statement mit “LIKE” und an entsprechender Stelle in der Ausnahmentabelle mit “%” als Inhalt für diese Felder. Das funktioniert soweit ganz gut. Einziges Problem ist, wenn in der Artikeltabelle eines der Felder FELD1-FELD4 nicht gefüllt und somit NULL ist. Diese werden dann nicht mit berücksichtig. Wie kann ich diese NULL-Felder mit einbeziehen???

Beispiel:

Update Statement 

UPDATE tbl_artikel
SET kennzeichen = TRUE
FROM tbl_ausnahmen 
WHERE  tbl_artikel.FELD1 LIKE tbl_ausnahmen.FELD1
AND tbl_artikel.FELD1 LIKE tbl_ausnahmen.FELD2
AND tbl_artikel.FELD1 LIKE tbl_ausnahmen.FELD3
AND tbl_artikel.FELD1 LIKE tbl_ausnahmen.FELD4



tbl_ausnahmen
FELD1 |  FELD2  |  FELD3  |  FELD4    
021      xxx       %         %
025      xxy       ab5       4xxx
...



tbl_artikel

ARTIKELNR |  FELD1  |  FELD2  |  FELD3  |  FELD4  |  KENNZ
0815         021       xxx       1234  
0815         021       xxx       7894      abab
....

Prüfe mittels “is null” auf NULL.

Andreas

Ja schon, aber wie bekomme ich das mit in das Update Statement unter? Die Abfrage muss ja so variabel bleiben, dass die Inhalte aus den beiden anderen Tabellen trotzdem korrekt verglichen werden. Die Ausnahmentabelle wird über einen Lader aus einer Excel-Tabelle gefüllt und kann öfters geändert werden. Die Wildcards sind also nicht immer grundsätzlich an der gleichen Stelle notwendig. Und wenn ein Feld in der Artikeltabell NULL ist, heisst das ja auch nicht grundsätzlich, dass es von Relevanz ist nur wenn an entprechender Stelle in der Ausnahmentabelle ein ‘%’ steht…

Aus dem ersten Posting:

eines der Felder FELD1-FELD4 nicht gefüllt und somit NULL ist. Diese werden dann nicht mit berücksichtig. Wie kann ich diese NULL-Felder mit einbeziehen???

Wie sollen diese berücksichtigt werden? Du kannst diese auf NULL prüfen, mittels “is null”, in der where-Bedingung.

Andreas

Vielleicht hab ich Dich bis jetzt flasch verstanden und du suchst coalesce(feld, ‘’) oder sowas.

Andreas

Ich glaube wir reden etwas an einander vorbei…
Ich versuche es noch einmal genauer zu beschreiben, aber vielleicht bin ich ja auch grade schwer von Begriff:
Die Felder in der Artikeltabelle können NULL sein. Es geht darum zu prüfen, ob die Felder FELD1 bis FELD4 in der Artikeltabelle mit den Feldern FELD1 bis FELD4 in der Ausnahmentabelle übereinstimmen. Wenn ja, wird in der Artikeltabelle das Kennzeichen gesetzt. Wenn also jetzt in der Ausnahmentabelle z.B. die Felder FELD1 bis FELD3 einen bestimmten Wert haben, der Wert in FELD4 aber egal ist würde ich dort ein ‘%’ eintragen. Beim Abgleich mit der Artikeltabelle sollen jetzt alle Datensätze aus der Artikeltabelle deren Felder FELD1 bis FELD3 und egal welchem Inhalt ind FELD4 (also auch NULL) upgedatet werden.

Ich kann nur nicht generell auf NULL prüfen, da es ja sein könnte, dass FELD4 in der Ausnahmentabelle auch einen spezifischen wert hat, dann dürften keine NULL Felder in der Artikeltabell selektiert werden.

Um das mal zu zeigen:

test=*# select *, case when t is null then 'NULL' else t end from foo;
 id |             t             | b |             t
----+---------------------------+---+---------------------------
  1 | erster Teile zweiter teil |   | erster Teile zweiter teil
  2 |                           |   | NULL
  3 | test                      | t | test
(3 rows)

test=*# select * from foo where coalesce(t,'') like 'a';
 id | t | b
----+---+---
(0 rows)

test=*# select * from foo where coalesce(t,'') like '%';
 id |             t             | b
----+---------------------------+---
  1 | erster Teile zweiter teil |
  2 |                           |
  3 | test                      | t
(3 rows)

Andreas

Mit dem coalesce stand ich etwas auf dem Schlauch. Danke, genau das hatte ich gesucht :slight_smile:

coalesce ist aber in where - klauseln mit vorsicht zu geniessen - bedenke, dass dein indexausdruck nicht matched wenn coalesce nicht auch in diesen vorkommt …


warum fragst nicht einfach nach bla like … or bla is null ?

Weil die NULL nur dann auch mitselektiert werden sollen, wenn in der Ausnahmentabell im entsprechenden Feld ein ‘%’ steht. Ansonsten sollen wirklich nur die Werte die in der Spalte stehen selektiert werden…
Bei einem OR … IS NULL würde das ja dann immer mit selektiert.

where … OR (bla is NULL AND ausnahme LIKE ‘^%’ ESCAPE ‘^’)

so in etwa … das prinzip … wie gesagt … coalesce ist auch gut - wenn du sowieso keine indizes hast (kleine tabellen) wuerd ich coalesce nehmen … wenn du indizes auf den kriterien hast - musst du entweder das coalesce in den index ausdruck uebernehmen (dann geht der aber auch nur mit coalesce) oder eben die bedingung entsprechend oben gestalten …

sollte nur ein hinweis sein

Die Tabellen sind aber recht überschaubar, coalesce funktioniert soweit ganz gut. Aber Danke für den Tipp mit dem Index!