#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 десятичными знаками (что, похоже, то, что вы хотите).