Bei ILIKE werden unerwünschte Ergebissse angezeigt

Bei ILIKE werden unerwünschte Ergebinsse angezeigt.
Hat jemand Lust mit mir zu reden und ein Suchproblem zu lösen, als Belohnung gebe ich Gewinnbeteiligung.
Skype:

Geändert von Xandrian: Kontaktdaten entfernt da diese und die Absichten nicht verifiziert werden können.

So funktioniert das Forum hier nicht. Probleme sollte hier diskutiert werden, nicht auf einem anderen Kanal.

Dazu bitte das SQL zeigen welches Du verwendest, sowie einige Beispieldaten. Zusätzlich kannst Du noch ein “SQL Fiddle” zur Verfügung stellen. Z.B. über diese Webseite: Postgres 13 | db<>fiddle

1 Like

Ich will das alle Ergebnisse angezeigt werden, die die Wörter Karry und Mullis haben, aber nicht Merror und auch nicht Terkel enthalten. Gesucht wird nicht nur in einer Spalte sondern in mehreren: remaks, tags und name.

Ich habe den Befehl so geschrieben, allerdings funktioniert er nicht:

SELECT * FROM table_video WHERE NOT (( (remarks IS NOT NULL AND remarks ILIKE ‘%Merror%’ OR name IS NOT NULL AND name ILIKE ‘%Merror%’ OR tags IS NOT NULL AND tags ILIKE ‘%Merror%’))
AND (remarks IS NOT NULL AND remarks ILIKE ‘%Terkel%’ OR name IS NOT NULL AND name ILIKE ‘%Terkel%’ OR tags IS NOT NULL AND tags ILIKE ‘%Terkel%’))
OR (( (remarks ILIKE ‘%Karry%’ OR name ILIKE ‘%Karry%’ OR tags ILIKE ‘%Karry%’))
AND (remarks ILIKE ‘%mullis%’ OR name ILIKE ‘%mullis%’ OR tags ILIKE ‘%mullis%’)) ORDER BY table_video.date_time desc LIMIT 99

Ich habe es schon selbst hinbekommen, bei der Auschlussklausel habe ich IS NOT NULL rausgenommen und dann ging es.

NOT mit IS NOT NULL zu kombinieren ist extrem verwirrend - zudem ist das IS NOT NULL überflüssig.

Ich denke, Du kannst das vereinfachen zu:

SELECT * 
FROM table_video 
WHERE (remarks ILIKE ANY (array['%Karry%, '%Mullis%']) and remarks not ilike all (array['%Merror%', '%terkel%']))
   OR (tags ILIKE ANY (array['%Karry%, '%Mullis%']) and tags not ilike all (array['%Merror%', '%terkel%']))
   OR (name ILIKE ANY (array['%Karry%, '%Mullis%']) and name not ilike all (array['%Merror%', '%terkel%']))

Wow, daß ging ja Schnell, danke!
Ich teste es gerade durch.

ilike all kannte ich noch nicht. Danke für den Tipp!

Man kann auch die Wiederholung vermeiden, so was in der Art:

select *
from table_video 
where exists (select * 
              from (values (remarks), (tags), (name)) as x(val)
              where x.val ilike any(array['%karry%', '%mullis%'])
                and x.val not ilike all(array['%merror%', '%terkel%']))

Ich sehe gerade, daß es nicht funktioniert.
Wenn ich nur ein Wort eingebe, was gefiltert werden soll wird gar nichts angezeigt:
SELECT COUNT(*) FROM table_video WHERE NOT ( (remarks ILIKE ‘%Merror Terkel%’ OR name ILIKE ‘%Merror Terkel%’ OR tags ILIKE ‘%Merror Terkel%’))

Und zwar liegtes an dem Attribut remarks , weil es NULL ist.

Ich habe es ausprobiert, es funktioniert nicht. Es werden trozdem unerwünschte Ergebnisse angezeigt. Das liegt sicher daran, das manche Attribute von Datensätzen keinen Wert haben(also NULL sind).