È anche importante capire che ANY
è non un operatore ma un costrutto SQL che può essere utilizzato solo a destra di un operatore. Altro:
- Come utilizzare ANY invece di IN in una clausola WHERE con Rails?
Il LIKE
operatore - o più precisamente:espressione , che viene riscritto con ~~
operatore in Postgres internamente - si aspetta il valore a sinistra e il modello A destra. Non esiste un COMMUTATOR
per questo operatore (come per l'operatore di uguaglianza semplice =
) quindi Postgres non può capovolgere gli operandi.
Il tuo tentativo:
select * from someTable where '%someInput%' LIKE ANY(someColum);
ha capovolto l'operando sinistro e destro quindi '%someInput%'
è il valore e gli elementi della colonna dell'array someColum
sono considerati modelli (che non è quello che vuoi).
lo farebbe deve essere ANY(someColum) LIKE '%someInput%'
- tranne che non è possibile con ANY
costrutto che è consentito solo a destra di un operatore. Stai incontrando un blocco stradale qui.
Correlati:
- C'è un modo per indicizzare utilmente una colonna di testo contenente pattern regex?
- PostgreSQL può indicizzare le colonne dell'array?
Puoi normalizzare il tuo design relazionale e salvare elementi dell'array in righe separate in una tabella separata. A parte ciò, unnest()
è la soluzione, come ti sei già trovato. Ma mentre sei interessato solo all'esistenza di almeno un elemento corrispondente, un EXISTS
la sottoquery sarà più efficiente evitando duplicati nel risultato - Postgres può interrompere la ricerca non appena viene trovata la prima corrispondenza:
SELECT *
FROM tbl
WHERE EXISTS (
SELECT -- can be empty
FROM unnest(someColum) elem
WHERE elem LIKE '%someInput%'
);
Potresti voler sfuggire al carattere speciale in someInput
. Vedi:
- Funzione di escape per espressioni regolari o pattern LIKE
Attento alla negazione (NOT LIKE ALL (...)
) quando NULL
possono essere coinvolti:
- Verifica se esiste NULL nell'array Postgres