Снежинка, если заменить шаблон строки

#sql #snowflake-cloud-data-platform

#sql #snowflake-cloud-data-platform

Вопрос:

У меня есть столбец, который должен содержать только числа [0-9], но в некоторых случаях мы начали видеть буквенно-цифровые [например: p8eSadfghrc] значения в этом столбце. Я хочу написать условие, при котором, если значение не является полностью числовым {0-9}, я хочу заменить его другим значением из другого столбца.

Ответ №1:

Что-то вроде этого?

 update t
    set col = <other value>
    where regexp_like(col, '[^0-9]');
  

Это обновляет данные. Вы также можете просто сделать это в запросе:

 select t.*,
       (case when regexp_like(col, '[^0-9]') then <other value> else col end)
from t;
  

Комментарии:

1. сбой, если в значении есть одно число.

2. Выражение {regexp_like(col, ‘[^0-9]’)} эквивалентно регулярному выражению ^[^0-9]$, которое истинно тогда и только тогда, когда col является строкой, содержащей ровно одну цифру. Измените его на {regexp_like(col, ‘.*[^0-9].*’)} и вы должны иметь то, что ищете.

3. @Zoom . , , Выражение возвращает true, если какой-либо символ в столбце НЕ является цифрой. Даже одна не цифра вернет true . Это то, о чем, похоже, спрашивает вопрос.

Ответ №2:

В Snowflake я бы рекомендовал try_to_decimal() . Он пытается преобразовать число в десятичное значение (вы управляете целевой точностью и масштабом с помощью аргументов) и возвращает null , если это не удается:

 select t.*, case when try_to_decimal(mycol) is null then myothercol else mycol end newcol
from mytable
  

Если вы хотите update , чтобы оператор:

 update mytable
set mycol = myothercol
where try_to_decimal(mycol) is null
  

Если не указано второго и третьего аргумента, количество разрешенных цифр равно 38, с 0 десятичными знаками (что, похоже, то, что вы хотите).