PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Suchen Sie Zeilen, in denen das Textarray einen ähnlichen Wert wie die Eingabe enthält

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