sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo obtener la posición de la coincidencia de expresiones regulares en una cadena en PostgreSQL?

Una forma (de muchas) de hacer esto:elimine el resto de la cadena que comienza en la coincidencia y mida la longitud de la cadena truncada:

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

Usando ILIKE en la cláusula WHERE, ya que suele ser más rápido (y hace lo mismo aquí).
También tenga en cuenta el cuarto parámetro de regexp_replace() función ('i' ), para que no distinga entre mayúsculas y minúsculas.

Alternativas

Según la solicitud en el comentario.
Al mismo tiempo, demostrando cómo ordenar coincidencias primero (y 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'));

Puede encontrar documentación para todo lo anterior en el manual aquí y aquí .

-> SQLfiddle demostrando todo.