sql >> Database >  >> RDS >> PostgreSQL

Hoe de positie van de regexp-overeenkomst in de tekenreeks in PostgreSQL te krijgen?

Een (van de vele) manier om dit te doen:verwijder de rest van de string vanaf de match en meet de lengte van de afgekapte string:

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

ILIKE gebruiken in de WHERE-component, aangezien dat doorgaans sneller is (en hier hetzelfde doet).
Let ook op de vierde parameter van de regexp_replace() functie ('i' ), om het hoofdletterongevoelig te maken.

Alternatieven

Volgens verzoek in de opmerking.
Tegelijkertijd demonstreren hoe overeenkomsten te sorteren eerst (en 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'));

U kunt documentatie voor al het bovenstaande vinden in de handleiding hier en hier .

-> SQLfiddle alles demonstreren.



  1. Hoe MySQL op de juiste manier met UTF-8 omgaat?

  2. DATEDIFF() Voorbeelden – MySQL

  3. MySQL INSERT en SELECT Prioriteitsvolgorde

  4. Overeenkomende Oracle dubbele kolomwaarden met Soundex, Jaro Winkler en Edit Distance (UTL_MATCH)