PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trova le righe in cui l'array di testo contiene un valore simile all'input

È 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