#snowflake-cloud-data-platform
#платформа облачных данных snowflake
Вопрос:
Попытка выполнить подобный запрос и получение ошибки «числовое значение не распознано». Типы данных для используемых столбцов следующие
Col1 - VARCHAR,
Col2 - VARCHAR,
Col3 - TIMESTAMP_NTZ(9)
Это мой запрос
Select count( distinct (
case when Col1 > 100
then concat(col2,cast(col3 as string))
else 0
end))
Ответ №1:
ваш СЛУЧАЙ возвращает a string
и a number
, которые не являются одинаковыми типами, поэтому, если вы превратите 0
их в строку '0'
, это должно работать лучше.
Кроме того, у вас все равно будет количество 1 для всех значений <= 100, что кажется несколько странным. Где-как если бы вы использовали null
вместо 0, тогда оно не будет учитываться и не будет иметь проблемы с типом.
Ответ №2:
ваше Col1
значение равно a VARCHAR
, но вы сравниваете его с числом. Хотя snowflake имеет оптимистичное автоматическое преобразование типов (т. Е. Преобразует строку в Col1
число), для одного или нескольких значений может произойти сбой. И поскольку вы не улавливаете эти ошибки, ваш запрос в целом завершится ошибкой.
Select count( distinct (
case when try_to_number(Col1) > 100
then concat(col2,cast(col3 as string))
else '0'
end))
try_no_number
попытается преобразовать значения Col1
в число и вернуть null
, когда это не удастся. Но это не выдаст ошибку.
А также примите во внимание то, что сказал Симеон. Т.е. результат у вас CASE
имеет разные типы. Я не знаю, как DISTINCT
это обрабатывается, но я могу себе представить, что он отделяет тип от первого значения, которое он видит, и если это число, он может попытаться преобразовать все остальные элементы также в числа, что может — в зависимости от значений — привести к той же ошибке.