Postgresql: извлечение подстроки после первого экземпляра разделителя - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь извлечь все после первого экземпляра разделителя.Например:

01443-30413 -> 30413
1221-935-5801 -> 935-5801

Я пробовал следующие запросы:

select regexp_replace(car_id, E'-.*', '') from schema.table_name;
select reverse(split_part(reverse(car_id), '-', 1)) from schema.table_name;

Однако оба возвращают:

  • 01443-30413 -> 30413
  • 1221-935-5801 -> 5801

Так что это не работает, если разделитель появляется несколько раз.

Я использую Postgresql 11. Я пришел из MySQL, где вы можете сделать:

select SUBSTRING(car_id FROM (LOCATE('-',car_id)+1)) from table_name

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

Я попробовал обычным способом, в общем, что мы делаем (нашел что-то похожее на instr как strpos в postgrsql.) Можете попробовать ниже

    SELECT
     SUBSTR(car_id,strpos(car_id,'-')+1,
     length(car_id) ) from table ;
0 голосов
/ 27 декабря 2018

Я думаю, что regexp_replace является подходящим, но с использованием правильного шаблона:

select regexp_replace('1221-935-5801', E'^[^-]+-', '');

935-5801

Шаблон регулярного выражения ^[^-]+- соответствует, с начала строки, одному или нескольким не тире, заканчиваяс чертой.Затем он заменяется пустой строкой, эффективно удаляя это содержимое.

Обратите внимание, что этот подход также работает, если у ввода вообще нет черточек, и в этом случае он просто вернет исходный ввод.

0 голосов
/ 27 декабря 2018

Используйте этот шаблон регулярного выражения:

select regexp_replace('1221-935-5801', E'^[^-]+-', '') from schema.table_name

Объяснение регулярного выражения:

  • ^ - начало строки
  • [^-]+ означает, по крайней мере,один символ, отличный от -
  • ... до тех пор, пока не будет встречен символ -
0 голосов
/ 27 декабря 2018

Почему бы просто не сделать PG-эквивалент вашего подхода MySQL и подстроить его?

SELECT SUBSTRING('abcdef-ghi' FROM POSITION('-' in 'abcdef-ghi') + 1) 

Если вам не нравятся "от" и "в" способ написания аргументов, у PG также есть "нормальные "функции, разделенные запятыми:

SELECT SUBSTR('abcdef-ghi', STRPOS('abcdef-ghi', '-') + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...