sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur får man positionen för regexp-matchning i sträng i PostgreSQL?

Ett sätt (av många) att göra detta:Ta bort resten av strängen som börjar vid matchningen och mät längden på den trunkerade strängen:

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

Använder ILIKE i WHERE-satsen, eftersom det vanligtvis är snabbare (och gör samma sak här).
Observera den fjärde parametern till regexp_replace() funktion ('i' ), för att göra det skiftlägesokänsligt.

Alternativ

Enligt begäran i kommentaren.
Vi visar samtidigt hur man sorterar matchningar först (och 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 hitta dokumentation för allt ovan i manualen här och här .

-> SQLfiddle demonstrerar alla.



  1. PHP Kontrollera MySQL sista raden

  2. Möjligt att köra två instanser av docker-containrar på en mysql-databasbehållare?

  3. mySQL regex i where-satsen

  4. json-fältet på mysql where klausul