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

Come ottenere la posizione della corrispondenza regexp nella stringa in PostgreSQL?

Un modo (tra tanti) per farlo:rimuovi il resto della stringa che inizia alla corrispondenza e misura la lunghezza della stringa troncata:

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

Usando ILIKE nella clausola WHERE, poiché in genere è più veloce (e fa lo stesso qui).
Notare anche il quarto parametro per regexp_replace() funzione ('i' ), per non fare distinzione tra maiuscole e minuscole.

Alternative

Come da richiesta nel commento.
Allo stesso tempo dimostro come ordinare corrispondenze first (e 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'));

Puoi trovare la documentazione per tutto quanto sopra nel manuale qui e qui .

-> SQLfiddle dimostrando tutto.