Es ist auch wichtig zu verstehen, dass ANY
ist nicht ein Betreiber sondern ein SQL-Konstrukt, das nur rechts verwendet werden kann eines Betreibers. Mehr:
- Wie verwendet man ANY statt IN in einer WHERE-Klausel mit Rails?
Das LIKE
Operator - oder genauer:Ausdruck , die mit in ~~
umgeschrieben wird Betreiber in Postgres intern - erwartet den Wert links und das Muster Nach rechts. Es gibt keinen COMMUTATOR
für diesen Operator (wie für den einfachen Gleichheitsoperator =
), sodass Postgres die Operanden nicht umdrehen kann.
Ihr Versuch:
select * from someTable where '%someInput%' LIKE ANY(someColum);
hat linken und rechten Operanden vertauscht, also '%someInput%'
ist der Wert und Elemente der Array-Spalte someColum
werden als Muster angesehen (was Sie nicht wollen).
Es würde muss ANY(someColum) LIKE '%someInput%'
sein - außer das ist mit dem ANY
nicht möglich Konstrukt, das nur rechts erlaubt ist eines Betreibers. Sie treffen hier auf eine Straßensperre.
Verwandte:
- Gibt es eine Möglichkeit, eine Textspalte mit Regex-Mustern sinnvoll zu indizieren?
- Kann PostgreSQL Array-Spalten indizieren?
Sie können Ihr relationales Design normalisieren und Elemente speichern des Arrays in separaten Zeilen in einer separaten Tabelle. Abgesehen davon, unnest()
ist die Lösung, wie Sie selbst schon gefunden haben. Aber während Sie nur an der Existenz mindestens eines übereinstimmenden Elements interessiert sind, ist ein EXISTS
Unterabfrage ist am effizientesten und vermeidet Duplikate im Ergebnis - Postgres kann die Suche stoppen, sobald die erste Übereinstimmung gefunden wird:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
Möglicherweise möchten Sie Sonderzeichen in someInput
maskieren . Siehe:
- Escape-Funktion für reguläre Ausdrücke oder LIKE-Muster
Vorsicht mit der Negation (NOT LIKE ALL (...)
) wenn NULL
beteiligt sein können:
- Überprüfen Sie, ob NULL im Postgres-Array vorhanden ist