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

Hvordan får man position for regexp-match i streng i PostgreSQL?

En måde (af mange) at gøre dette på:Fjern resten af ​​strengen, der begynder ved matchen, og mål længden af ​​den afkortede streng:

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

Brug af ILIKE i WHERE-sætningen, da det typisk er hurtigere (og gør det samme her).
Bemærk også den fjerde parameter til regexp_replace() funktion ('i' ), for at gøre det ufølsomt over for store og små bogstaver.

Alternativer

Som på anmodning i kommentaren.
Samtidig demonstreres, hvordan man sorterer matches først (og 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'));

Du kan finde dokumentation for alt ovenstående i manualen her og her .

-> SQLfiddle demonstrerer alle.



  1. SQL server Integration Services 2008-2005 kompatibilitet

  2. hvordan omdøber man et skema i MySQL

  3. PHP-kommandoer ude af synkronisering

  4. Hvordan undslipper jeg et enkelt citat i SQL Server?