PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erhalte ich die Position der Regexp-Übereinstimmung in der Zeichenfolge in PostgreSQL?

Eine Möglichkeit (von vielen), dies zu tun:Entfernen Sie den Rest der Zeichenfolge, beginnend bei der Übereinstimmung, und messen Sie die Länge der abgeschnittenen Zeichenfolge:

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

Mit ILIKE in der WHERE-Klausel, da dies normalerweise schneller ist (und hier dasselbe tut).
Beachten Sie auch den vierten Parameter für regexp_replace() Funktion ('i' ), um die Groß-/Kleinschreibung zu ignorieren.

Alternativen

Auf Wunsch im Kommentar.
Gleichzeitig wird demonstriert, wie man Matches sortiert zuerst (und 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'));

Dokumentation für alle oben genannten Punkte finden Sie im Handbuch hier und hier .

-> SQLfiddle alles demonstrieren.