PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir la position de la correspondance d'expression régulière dans la chaîne dans PostgreSQL ?

Une façon (parmi tant d'autres) de procéder :supprimez le reste de la chaîne en commençant par la correspondance et mesurez la longueur de la chaîne tronquée :

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

Utiliser ILIKE dans la clause WHERE, car c'est généralement plus rapide (et fait la même chose ici).
Notez également le quatrième paramètre de regexp_replace() fonction ('i' ), pour le rendre insensible à la casse.

Alternatives

Conformément à la demande dans le commentaire.
Montrant en même temps comment trier les correspondances premier (et 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'));

Vous pouvez trouver de la documentation pour tout ce qui précède dans le manuel ici et ici .

-> SQLfiddle démontrant tout.