È 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