Проблема синтаксического анализа даты в предложении where в запросе Snowflake

Я выполняю запрос Snowflake, который предназначен для возврата записей, которые, помимо прочего, имеют дату, более раннюю, чем текущая дата.

select *
from table_a
where id < 100 and
date < ???

Проблема в том, что данные, для которых выполняется этот запрос, содержат ошибки в столбце даты. Например, одно значение может быть одной цифрой (например, 2). Я не хочу, чтобы запрос разбивался по этим строкам. Вот почему я хочу написать case в предложении where, чтобы рассматривать только записи, дата которых равна YYYY-MM-DD. Я пробовал следующее, но он возвращает синтаксические ошибки:

and date = case WHEN date like '____-__-__' then date < current_date() else NULL

Также

and date < case WHEN date like '____-__-__' then current_date() else NULL

(В случае, если он не виден из-за форматирования, это 4 символа подчеркивания - означает любой символ, за которым следует один дефис, за которым следуют 2 символа подчеркивания, затем дефис, а затем еще два символа подчеркивания.)

Вы можете предположить, что у current_date() нет проблем. При необходимости его можно даже заменить на какое-то жестко запрограммированное значение.

Как мне написать этот запрос?


person BlameMe    schedule 19.08.2020    source источник


Ответы (2)


Используйте TRY_TO_DATE(date,'YYYY-MM-DD'), поскольку он пытается преобразовать его в дату, и при недопустимом формате он автоматически превратится в NULL

Таким образом, вы можете применить фильтр не NULL рядом со сравнением дат.

https://docs.snowflake.com/en/sql-reference/functions/try_to_date.html

person Monem_منعم    schedule 19.08.2020

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

SELECT * FROM (SELECT '2020-05-12' AS string) a where REGEXP_LIKE(string,'\\d{4,4}\\-\\d{1,2}-\\d{1,2}');

https://community.snowflake.com/s/article/How-to-use-snowflake-regular-expression

person Iqra Ijaz    schedule 19.08.2020
comment
Решение, предложенное Monem, более элегантно - person Rajib Deb; 19.08.2020