Извлечь строки, если до или после шаблона в postgres 11 есть 'n' слов - PullRequest
2 голосов
/ 18 июня 2020

У меня есть следующая таблица в postgres

col1        col2            col3
NCT00000412 Drug            Placebo Calcitriol
NCT00000412 Drug            Placebo Alendronate
NCT00000774 Biological      Placebo version of rgp120/HIV-1MN
NCT00000774 Biological      Placebo version of rgp120/HIV-1SF2
NCT00005648 Drug            Gemcitabine with Placebo
NCT00007631 Drug            Tretinoin 0.1% cream or placebo
NCT00007735 Drug            Doxycycline (200mg/day) or Placebo
NCT00032435 Drug            PAL-40 Placebo
NCT00032435 Drug            abciximab placebo; reteplase placebo, abciximab  
NCT00032435 Drug            Valsartan placebo + nateglinide placebo  

Я пытаюсь извлечь те строки, где слово плацебо имеет одно слово до или после него. Ожидаемый результат:

col1        col2    col3
NCT00000412 Drug    Placebo Calcitriol
NCT00000412 Drug    Placebo Alendronate
NCT00032435 Drug    PAL-40 Placebo

Я пробовал следующее регулярное выражение:

select * from table
where name ~* '\splacebo\w+' or name ~* '\w+placebo\s'

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Вы можете использовать

select * from table
    where name ~* '^(?:placebo\s+\S+|\S+\s+placebo)$'

См. демонстрацию регулярных выражений

Подробности

  • ^ - начало строки
  • (?:placebo\s+\S+|\S+\s+placebo) - группа без захвата соответствует либо
    • placebo\s+\S+ - placebo, затем 1+ пробелов, а затем 1+ непробелов
    • | - или
    • \S+\s+placebo - 1+ пробелов, затем 1+ пробелов, а затем placebo
  • $ - конец строка.
0 голосов
/ 18 июня 2020

В качестве примечания, вы можете сделать это, просто используя like:

where (name like '% Placebo%' and name not like '% % Placebo%') or
      (name like '%Placebo %' and name not like '%Placebo % %') 
0 голосов
/ 18 июня 2020

Я думаю, вы хотите:

where col3 ~* '(^\S+\s+placebo)|(placebo\s+\S+$)'

Разбивка:

(
    ^              beginning of the string
    \S+            1 to N characters other than a space
    \s+            1 to N spaces
    placebo        literal string "placebo"
)
|              OR
(
    placebo         literal string "placebo"
    \s+             1 to N spaces
    \S+             1 to N characters other than a space
    $               end of the string
)

Я использовал \S вместо \w, потому что вы хотите сопоставить тире (что \w не работает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...