Mehrere Begriffe in ILIKE verwenden und nach diesen Begriffen auch GROUP BY beutzen

Guten Morgen, ich bin neu in Sachen PostgreSQL und bin jetzt an ein Problem gestoßen, welches ich eventuell nicht ganz verstehe und auch keinen richtigen Ansatz für finde. Ich habe schon im Forum gesucht und auch manche Inspiration gefunden, jedoch führten diese nicht zum gewünschten Ziel.

Also nun zu meinem Problem.

Ich habe einen Table mit Projekten, darin enthalten ist Startzeitpunkt, Endzeitpunkt, sowie Bemerkung und Projektname. Meine Abfrage soll die Spalte Bemerkung nach einem Begriff durchsuchen, dies löste ich mit bemerkung ILIKE '%begriff%' . Darauf sollten dann aus Startzeitpunkt und Endzeitpunkt die Dauer des Projekts berechnet werden und und dann die Summe der Dauer aller Projekte mit besagtem Begriff berechnet werden.

SELECT SUM(Endzeitpunkt - Startzeitpunkt) WHERE bemerkung ILIKE '%begriff%'

Jetzt soll es aber auch möglich sein, dass mehrere Begriffe abgefragt werden. Die Eingabe erfolgt über eine Maske auf einer Internetseite, sodass diese als ein String weitergegeben wird.

Dann bin ich auf unnest(string_to_array('begriffe',', ') gestoßen, welches mir bei
SELECT unnest(string_to_array('begriffe',', ') und der richtigen Eingabe “Begriff1, Begriff2, Begriff3” auch diese 3 Begriffe als Rows ausgibt.

Jedoch weiß ich nicht, wie ich damit jetzt weiter arbeiten kann, ist es möglich diese Begriffe aus den Rows irgendwie zu verwenden in meiner WHERE-Clause oder bin ich komplett auf dem Holzweg?

Am Ende sollen in der ersten Spalte die Begriffe stehen und in der zweiten immer passend dazu die Gesamtdauer der Projekte, also im Endeffekt ein GROUP BY durch die Suchbegriffe.

Begriffe Gesamtdauer
Begriff1 02:00:00
Begriff2 01:45:00
Begriff3 05:37:00

Ich hoffe mein Anliegen ist einigermaßen zu verstehen.
Über jegliche Denkanstöße und Tipps wäre ich sehr dankbar.

Grüße Morth

Du kannst die Eingabe in ein array verwandeln, dann geht das mit

ilike any (string_to_array('begriffe', ','))

Das setzt aber voraus, dass die Begriffe auch die Wildcards enthalten, z.B.: '%hallo%,%welt%'

Ist das nicht der Fall, dann musst Du wirklich über unnest gehen und eine EXISTS Bedingung verwenden:

select ...
from the_table t
where exists (select *
              from unnest(string_to_array('.....', ',')) as x(begriff)
              where t.bemerkung ilike concat('%', x.begriff, '%'))

Seit Postgres 14 kann man unnest(string_to_array()) auch durch mit string_to_table() ersetzen

Vielen Dank für die schnelle Antwort. Ich hab das EXISTS implementiert bekommen, aber jetzt haben die Begriffe immer die Gesamtdauer aller gesuchten Begriffe also:

Begriffe Gesamtdauer
Begriff1 03:45:00
Begriff2 03:45:00

anstatt

Begriffe Gesamtdauer
Begriff1 02:00:00
Begriff2 01:45:00

mit GROUP BY scheint das aufteilen nicht zu funtionieren

Gruß Morth

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.