PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да получа позиция на съвпадение на regexp в низ в PostgreSQL?

Един от начините (от много) да направите това:Премахнете останалата част от низа, започващ от съвпадението, и измерете дължината на съкратения низ:

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

Използване на ILIKE в клаузата WHERE, тъй като това обикновено е по-бързо (и прави същото тук).
Обърнете внимание и на четвъртия параметър към regexp_replace() функция ('i' ), за да го направи нечувствителен към главни и малки букви.

Алтернативи

Съгласно заявката в коментара.
В същото време демонстрира как да сортирате съвпаденията първо (и 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'));

Можете да намерите документация за всичко по-горе в ръководството тук и тук .

-> SQLfiddle демонстрира всички.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres INSERT ON CONFLICT DO UPDATE срещу INSERT или UPDATE

  2. Как Pi() работи в PostgreSQL

  3. SQLAlchemy + Postgres:Може да се наложи да добавите изрични преобразувания на типове при сливане

  4. Как да инсталирам postgres с NSIS с всички параметри?

  5. Как да сортирате резултата от string_agg()