sql >> Databáze >  >> RDS >> PostgreSQL

Najděte řádky, kde textové pole obsahuje hodnotu podobnou vstupu

Je také důležité pochopit, že ANY není operátora ale konstrukt SQL, který lze použít pouze správně operátora. Více:

  • Jak použít ANY místo IN v klauzuli WHERE s Rails?

LIKE operátor – nebo přesněji:výraz , který je přepsán pomocí do ~~ operátor v Postgresu interně - očekává hodnotu doleva a vzor doprava. Neexistuje žádný COMMUTATOR pro tento operátor (jako je tomu u jednoduchého operátoru rovnosti = ), takže Postgres nemůže obracet operandy.

Váš pokus:

select * from someTable where '%someInput%' LIKE ANY(someColum);

přehodil levý a pravý operand, takže '%someInput%' je hodnota a prvky sloupce pole someColum jsou považovány za vzory (což není to, co chcete).

by musí být ANY(someColum) LIKE '%someInput%' - kromě toho, že to není možné s ANY konstrukt, který je povolen pouze vpravo operátora. Zde narazíte na zátaras.

Související:

  • Existuje způsob, jak užitečně indexovat textový sloupec obsahující vzory regulárních výrazů?
  • Může PostgreSQL indexovat sloupce pole?

Můžete normalizovat svůj relační návrh a uložit prvky pole v samostatných řádcích v samostatné tabulce. V opačném případě unnest() je řešení, jak jste již sami našli. Ale zatímco vás zajímá pouze existence alespoň jednoho shodného prvku, EXISTS poddotaz bude nejefektivnější a zároveň se vyhne duplicitám ve výsledku – Postgres může zastavit vyhledávání, jakmile je nalezena první shoda:

SELECT *
FROM   tbl
WHERE  EXISTS (
    SELECT -- can be empty 
    FROM   unnest(someColum) elem
    WHERE  elem LIKE '%someInput%'
  );

Můžete chtít speciální znak v someInput . Viz:

  • Funkce Escape pro regulární výraz nebo vzory LIKE

Opatrně s negací (NOT LIKE ALL (...) ), když NULL může být zapojen:

  • Zkontrolujte, zda v poli Postgres existuje NULL


  1. Optimalizace překrývajících se dotazů Část 1:Úvod a vylepšené řešení T-SQL

  2. SET versus SELECT při přiřazování proměnných?

  3. Jak na serveru SQL Server pivotovat pro více sloupců

  4. Žádné jedinečné nebo vyloučení omezení neodpovídá ON CONFLICT