как обрезать записи до 3-го появления в postgresql - PullRequest
0 голосов
/ 24 апреля 2020

Мне нужен запрос, чтобы получить строку после 3-го вхождения '~' в postgresql:

input:
1~2~3~4~5~6~7~8
7~8~22~99~1

Output:
4~5~6~7~8
99~1

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

К сожалению, Postgres не имеет функции "найти n-е происхождение". Но учитывая формат вашей строки, я думаю, что для этого можно использовать массивы:

with test_data (input) as (
  values 
     ('1~2~3~4~5~6~7~8'),
     ('7~8~22~99~1')
)     
select input, array_to_string((string_to_array(input, '~'))[4:], '~') new_value
from test_data;

возвращает:

input           | new_value
----------------+----------
1~2~3~4~5~6~7~8 | 4~5~6~7~8
7~8~22~99~1     | 99~1     
0 голосов
/ 24 апреля 2020

Мне нравится ответ "без лошади". Но вот еще один метод, использующий регулярные выражения:

select regexp_replace(str, '^([^~]*[~]){3}$', '')
from (values ('1~2~3~4~5~6~7~8'), ('7~8~22~99~1')) v(str);

Или regexp_matches():

select str, (regexp_matches(str, '^([^~]*[~]){3}(.*)$'))[2] as retval
from (values ('1~2~3~4~5~6~7~8'), ('7~8~22~99~1'), ('1~2')) v(str)

Здесь - это db <> скрипка.

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