2016-10-28 2 views
1

Ich habe eine Tabelle mit einem Feld mit einem Array von Zeichenfolgen (Typ ist character varying(255)[]).PostgreSQL: Where-Klausel mit LIKE, ANY, und Wildcards

Ich mag würde eine bestimmte Zeichenkette mit einem Platzhalter vergleichen, sagen 'query%', einem der Elemente dieses Feldes.

Diese Anforderung funktioniert und die erwarteten Ergebnisse zurückkommt:

SELECT * FROM my_table WHERE 'query' ILIKE ANY(my_field) 

Aber mit dem Platzhalter, ich habe keine Ergebnisse:

SELECT * FROM my_table WHERE 'query%' ILIKE ANY(my_field) 

Ich denke, der Grund ist, dass der Platzhalter nur dann unterstützt, wird bei die rechte Seite des ILIKE Betreibers, aber ANY(my_field) muss auch nach dem Betreiber sein.

Gibt es eine Möglichkeit zu erreichen, was ich will?

Mit PostgreSQL 9.5.

+0

Mögliches Duplikat [PostgreSQL - Text Array enthält Wert ähnlich zu] (http://stackoverflow.com/questions/34657669/postgresql-text-array-contains-value-similar-to) – pozs

+0

Sie haben Recht, das ist ein Duplikat, ich hatte es nicht gesehen. Aber ich bin froh, dass @klin eine ausführliche Antwort geschrieben hat, die nicht in dem anderen Post war. – scandel

Antwort

2

Sie haben das Array-Feld UNNEST:

with my_table(my_field) as (
values 
    (array['query medium', 'large query']), 
    (array['large query', 'small query']) 
) 
select t.* 
from my_table t, 
lateral unnest(my_field) elem 
where elem ilike 'query%'; 

      my_field    
-------------------------------- 
{"query medium","large query"} 
(1 row) 
+0

Danke, das ist die perfekte Lösung. Ich musste nur ein DISTINCT hinzufügen (wählen Sie distinct t. *), Weil es einige Zeilen in meiner Tabelle gab, wo 'query%' mehrmals in my_field erschien. – scandel

1

Konvertieren das Array in einen Satz mit UNNEST() und verwenden Sie eine EXIST-Klausel

SELECT * FROM my_table t WHERE EXISTS (SELECT unnest(t.my_field) AS f WHERE f ILIKE ‘query%’) 
+0

Danke, das ist auch eine gute Lösung, weil alles in der Where-Klausel bleibt, kann es für kompliziertere Anfragen nützlich sein. Aber Ihre Anfrage löst einen postgresql-Fehler aus, ich musste ihn modifizieren, um es zum Laufen zu bringen: 'SELECT * FROM my_table t WO EXISTIERT (SELECT f FROM unnest (t.my_field) AS f WHERE f ILIKE 'query%')' – scandel