#sql #snowflake-cloud-data-platform
Вопрос:
У меня есть таблица с несколькими столбцами, которые я должен просмотреть, чтобы проверить это значение: '[m='
и вернуть числа в этом списке.
Например, допустим, у меня есть это в столбце «имя» xyzzy [m=123]
, которое я хочу вернуть 123
. Я пытался выполнить приведенный ниже запрос, но он не работает, потому что я продолжаю видеть следующую ошибку:
Ошибка компиляции SQL: строка синтаксической ошибки 3 в позиции 4 неожиданное «КОГДА». строка синтаксической ошибки 3 в позиции 34 неожиданное «)».
Я также думаю, что SPLIT_PART не сработает, потому что тогда, если у меня будет xyzzy [m=123], он вернет 123], и я не хочу, чтобы закрывающая скобка была включена
case
WHEN REGEXP_SUBSTR(name, '[m=') THEN SPLIT_PART(name, '[m=', )
WHEN REGEXP_SUBSTR(name2, '[m=') THEN SPLIT_PART(name2, '[m=', )
WHEN REGEXP_SUBSTR(name3, '[m=') THEN SPLIT_PART(name3, '[m=', )
WHEN REGEXP_SUBSTR(name4, '[m=') THEN SPLIT_PART(name4, '[m=', )
WHEN REGEXP_SUBSTR(name5, '[m=') THEN SPLIT_PART(name5, '[m=', )
WHEN REGEXP_SUBSTR(name6, '[m=') THEN SPLIT_PART(name6, '[m=', )
else null;
------ -------- --------- ------------ ------ ---------------- ---------------
| name | name2 | name3 | name3 | name5 | name6 |
------ -------- --------- ------------ ------ ---------------- ---------------
| xyzzy [m=123] | MyISAM | 10 | Fixed | 0 | my comment |
------ -------- --------- ------------ ------ ---------------- ---------------
| rts3 | MyISAM | 1 | test [m=122] | 4 | my comment |
------ -------- --------- ------------ ------ ---------------- ---------------
| rddts3 | MyISAM | 1 | dm32dfe | 4 | comment [m=177] |
------ -------- --------- ------------ ------ ---------------- ---------------
*** ПРАВКА: я попытался настроить свой запрос так, чтобы он выглядел следующим образом:
Select *,
CASE
WHEN REGEXP_SUBSTR(NAME, '(?:[m=)') THEN REGEXP_SUBSTR(NAME, '[[]m=([0-9] )'),
WHEN REGEXP_SUBSTR(NAME2, '(?:[m=)') THEN REGEXP_SUBSTR(NAME2, '[[]m=([0-9] )'),
ELSE null
END
from my_table
но теперь я вижу эту ошибку:
Ошибка компиляции SQL: строка ошибки 2 в позиции 0 Недопустимые типы аргументов для функции «IFF»: (VARCHAR(16777216), VARCHAR(16777216), NULL)
Ответ №1:
Вы можете просто использовать regexp_substr()
с группой захвата:
REGEXP_SUBSTR(name, '[[]m=([0-9] )', 1, 0, 'e')
Я не совсем понимаю, для чего у case
тебя такое выражение лица. Если вам нужно первое совпадение в наборе имен, вы можете использовать:
COALESCE(REGEXP_SUBSTR(name, '[[]m=([0-9] )', 1, 0, 'e'),
REGEXP_SUBSTR(name2, '[[]m=([0-9] )', 1, 0, 'e'),
. . .
)
Комментарии:
1. Спасибо, что откликнулись! @Гордон Линофф Я попробовал это, основываясь на том, что вы упомянули: Выберите*, случай, КОГДА REGEXP_SUBSTR(ИМЯ, ‘(?: [m=)’) ЗАТЕМ REGEXP_SUBSTR(ИМЯ, ‘[[]m=([0-9] )’) еще нулевой конец из my_table; но я вижу ошибку, о которой я упоминал в своем вопросе, которую я добавил как «редактировать»
2. @KristiLuna . . . Запустите код без
case
.case
В этом ответе нет никакого выражения.