Числовое значение не распознано

#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 это обрабатывается, но я могу себе представить, что он отделяет тип от первого значения, которое он видит, и если это число, он может попытаться преобразовать все остальные элементы также в числа, что может — в зависимости от значений — привести к той же ошибке.