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

Regulární výraz v klauzuli LIKE PostgreSQL

Stejně jako v komentáři @a_horse byste museli použít operátor regulárního výrazu ~ používat výrazy se závorkami.
Ale je toho víc. Navrhuji:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

^ ... shoda na začátku řetězce (váš původní výraz se může shodovat na jakýkoli pozici).
[^0] ... výraz v závorce (třída znaků) odpovídající jakémukoli znak, který není 0 .

Nebo lépe , ještě:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- starting with '00'
AND    value NOT LIKE '000%'  -- third character is not '0'

Proč? LIKE není tak výkonný, ale obvykle rychlejší než regulární výrazy. Pravděpodobně je podstatně rychlejší zúžit množinu kandidátů pomocí levného LIKE výraz.

Obecně byste použili NOT LIKE '__0' , ale protože jsme již vytvořili LIKE '00%' v druhém predikátu můžeme použít užší (levnější) vzor NOT LIKE '000' .

Postgres může používat jednoduchý index btree pro výrazy ukotvené vlevo value LIKE '00%' (důležité pro velké tabulky), zatímco u složitějšího regulárního výrazu to nemusí fungovat. Nejnovější verze Postgresu může používat indexy pro jednoduché regulární výrazy, takže může práce pro tento příklad. Podrobnosti:

  • Rozdíl mezi LIKE a ~ v Postgres


  1. zachytit výjimku DB v aplikaci JSF+EJB

  2. Světový den zálohování:Jak a kdy byste měli zálohovat databázi?

  3. Oracle:funkčně založená indexová selektivní jedinečnost

  4. Získejte sadu výsledků z uložené procedury Oracle