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

Jak získat pozici shody regulárních výrazů v řetězci v PostgreSQL?

Jeden způsob (z mnoha), jak to udělat:Odstraňte zbytek řetězce začínajícího na shodě a změřte délku zkráceného řetězce:

SELECT id, title
FROM   book
WHERE  title ILIKE '%deep%space%'
ORDER  BY length(regexp_replace(title, 'deep.*space.*', '','i'));

Pomocí ILIKE v klauzuli WHERE, protože to je obvykle rychlejší (a dělá totéž zde).
Všimněte si také čtvrtého parametru regexp_replace() funkce ('i' ), aby se nerozlišovala malá a velká písmena.

Alternativy

Podle požadavku v komentáři.
Zároveň ukázka toho, jak seřadit shody první (a NULLS LAST ).

SELECT id, title
      ,substring(title FROM '(?i)(^.*)deep.*space.*') AS sub1
      ,length(substring(title FROM '(?i)(^.*)deep.*space.*')) AS pos1

      ,substring(title FROM '(?i)^.*(?=deep.*space.*)') AS sub2
      ,length(substring(title FROM '(?i)^.*(?=deep.*space.*)')) AS pos2

      ,substring(title FROM '(?i)^.*(deep.*space.*)') AS sub3
      ,position((substring(title FROM '(?i)^.*(deep.*space.*)')) IN title) AS p3

      ,regexp_replace(title, 'deep.*space.*', '','i') AS reg4
      ,length(regexp_replace(title, 'deep.*space.*', '','i')) AS pos4
FROM   book
ORDER  BY title ILIKE '%deep%space%' DESC NULLS LAST
         ,length(regexp_replace(title, 'deep.*space.*', '','i'));

Dokumentaci pro všechny výše uvedené naleznete v příručce zde a zde .

-> SQLfiddle předvedení všech.



  1. Rails ActiveRecord - jak získat záznamy mezi dvěma daty

  2. Vrátit více hodnot z funkce Oracle

  3. Musí být seskupené indexy jedinečné?

  4. V MySQL funguje funkce CHAR() divně