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

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

Neexistuje .

Indexy vyžadují IMMUTABLE výrazy. Výsledek vašeho výrazu závisí na vstupním řetězci. Nevidím jiný způsob, než vyhodnotit výraz pro každý řádek, což znamená sekvenční skenování.

Související odpověď s dalšími podrobnostmi pro IMMUTABLE úhel:

Jen to, že pro váš případ neexistuje žádné řešení, což je nemožné indexovat. Index potřebuje ukládat konstantní hodnoty do svých n-tic, což prostě není k dispozici, protože výsledná hodnota pro každý řádek se vypočítává na základě vstupu. A nemůžete transformovat vstup, aniž byste se podívali na hodnotu sloupce.

Použití indexu Postgres je vázáno na operátory a indexuje pouze na výrazech vlevo operátora lze použít (kvůli stejným logickým omezením). Více:

Mnoho operátorů definuje COMMUTATOR což umožňuje plánovači / optimalizátoru dotazů otočit indexované výrazy doleva. Jednoduchý příklad:komutátor = je = . komutátor > je < a naopak. Dokumentace:

Operátor shody regulárního výrazu ~ opět nemá komutátor, protože to není možné. Podívejte se sami:

SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM   pg_operator
WHERE  oprname = '~'
AND    'text'::regtype IN (oprright, oprleft);

 oprname | oprright |  oprleft  | oprcom
---------+----------+-----------+------------
 ~       | text     | name      | 0
 ~       | text     | text      | 0
 ~       | text     | character | 0
 ~       | text     | citext    | 0

A přečtěte si příručku zde:

Zkoušel jsem to již dříve a musel jsem se smířit s tím, že je to z principu nemožné .




  1. Provádění změn ve více záznamech na základě změny jednoho záznamu pomocí SQL

  2. DROP TABLE MySQL

  3. Jak přepsat IS DISTINCT FROM a IS NOT DISTINCT FROM?

  4. Jak převést sekundu na čas pomocí MYSQL