Как удалить символы в строке после специального c специального символа (~) в снежинке sql? - PullRequest
0 голосов
/ 08 января 2020

Я использую Снежинку SQL. Я хотел бы удалить символы из строки после специального символа ~. Как я могу это сделать?

вот весь сценарий. Позволь мне объяснить. У меня есть строка вроде «CK # 123456 ~ fndkjfgdjkg». Теперь я хочу только число после #. И ничего после ~. Это длина номера варьируется для этого значения поля. Это может быть 1 или 5 или 3. И я хочу добавить условие, где класс, где это число равно check_num из другой таблицы после присоединения. Я пытаюсь использовать REGEXP_SUBSTR (A.SRC_TXT, '(? <= CK #) (. +? \ B)') = C .CHK_NUM в условии where. Я получаю сообщение об ошибке «Нет повторяющихся аргументов после?» </p>

Ответы [ 4 ]

2 голосов
/ 08 января 2020

Вы можете использовать регулярное выражение для этого

-- To remove just the character after a ~
select regexp_replace('fo~o bar','~.', '');
-- returns 'fo bar'

--If you want to keep the ~
select regexp_replace('fo~o bar','~.', '~');
-- returns 'fo~ bar'

--If you want to remove everything after the ~
select regexp_replace('fo~o bar','~.*', '');
--returns 'fo'

Если вам нужно удалить другие определенные c наборы символов после ~, вы, вероятно, можете сделать это с немного более сложным регулярным выражением, но я ' Мне нужны примеры вашего желаемого ввода / вывода, чтобы помочь с этим.

РЕДАКТИРОВАТЬ для обновленного вопроса

Эта замена регулярного выражения должна получить то, что вам нужно.

select regexp_replace('CK#123456~fndkjfgdjkg','CK#(\\d*)~.*', '\\1');
-- returns 123456 

(\\d*) получает ЛЮБОЕ число цифр в строке, и \\1 заставляет его заменить совпадение на то, что было в первом наборе скобок, который является вашим списком цифр. CK# и ~.* предназначены для того, чтобы убедиться, что вся строка соответствует и заменена.

Если CK# также может варьироваться, вы можете использовать .*? следующим образом.

select regexp_replace('ABCD123HI#123456~fndkjfgdjkg','.*?#(\\d*)~.*', '\\1')
-- returns 123456 
1 голос
/ 08 января 2020

Я бы, наверное, сделал что-то вроде следующего, достаточно просто, но не так круто, как функции типа RegEx.

set my_string='fooo~12345';
set search_for_me = '~';
SELECT SUBSTR($my_string, 1, DECODE(position($search_for_me, $my_string), 0, length($my_string), position($search_for_me, $my_string)));

Надеюсь, это поможет ... Rich

0 голосов
/ 24 января 2020

Вы можете проверить это !!

выбрать substr ('CK # 123456 ~ fndkjfgdjkg', 4,6) из двойного;

ВЫХОД 123456

https://docs.snowflake.net/manuals/sql-reference/functions/substr.html

0 голосов
/ 09 января 2020

Похоже, что lookahead и lookbehind не поддерживаются в функциях REGEXP, похоже, они работают в предложении PATTERN команды LIST. В документации Snowflake не упоминается ни взгляд вперед, ни взгляд назад.

В вашем примере:

  • Кажется, что механизм запросов ищет этот повторяющийся аргумент, когда вы пытаетесь посмотреть назад
  • Вы не указали, что вы хотел извлечь. У вас есть две группы захвата, но в этом сценарии все будет возвращено
  • Поскольку вы хотите удалить все после ~, у вас есть разделитель, почему бы не использовать его в вашей функции REGEXP_SUBSTR?

Попробуйте следующее:

SELECT $1,REGEXP_SUBSTR($1,'\\w+#(.+?)~',1,1,'is',1) 
FROM VALUES 
('CK#123456~fndkjfgdjkg')
,('QH#128fklj924~fndkjfgdjkg')
;

Это выглядит так:

  • Один или несколько символов слова
  • После #
  • Захват одного или нескольких символов до , а не , включая ~
  • Возвращает символы в группе захвата

Вы можете изменить .+? на \\d+?, чтобы убедиться, что шаблон состоит только из цифр. Обратная косая черта должна быть экранирована с помощью обратной косой черты sh.

Описание каждого аргумента функции можно найти здесь: https://docs.snowflake.net/manuals/sql-reference/functions/regexp_substr.html

...