Снежинка — проверка шаблона и возврат подстроки внутри этого шаблона

#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 В этом ответе нет никакого выражения.