Почему 0 равно пустой строке?


23

Мне нужна помощь в поиске, почему следующее T-SQLутверждение возвращает 1(true):

SELECT IIF( 0 = '', 1, 0)

Я предполагаю, что у кого-то есть изменения, ANSIнапример SET ANSI_NULLSили что-то еще, что вызывает поведение

Моя проблема заключается в том , что я вхожу в некоторые значения и в конечном наборе строк У меня есть ценности , которые присоединились 0и ''ценности, что не является правильным.

Ответы:


31

Это просто документированное поведение. Я не думаю, что кто-то напутал с настройками.

Смотрите приоритет данных типа на MSDN.

Когда оператор объединяет два выражения разных типов данных, правила для приоритета типа данных указывают, что тип данных с более низким приоритетом преобразуется в тип данных с более высоким приоритетом.

Как отмечено в комментариях, пустая строка преобразуется в 0 в любом числовом типе и в 1900-01-01 00: 00: 00.000 при преобразовании в дату.

РЕДАКТИРОВАТЬ: я думаю, что ваша реальная проблема заключается в том, что ваш дизайн так, что вы должны объединить в полях другого типа данных. Единственный способ обойти это - преобразование в предложении соединения, которое снизит производительность запросов. Основная проблема, вероятно, с дизайном схемы

РЕДАКТИРОВАТЬ: было много дискуссий в комментариях, которые были перемещены в чат. Как бы нелогично это ни казалось, преобразование пустой строки в другие типы данных приводит к произвольным значениям.

Этот код:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

Производит этот вывод:

0
0
1900-01-01
1900-01-01 00:00:00.000

Тогда вы можете ожидать, что это поведение согласуется с другими предыдущими типами данных, и ожидать, что преобразование 0 в дату приведет к тому же произвольному значению, но это не так.

SELECT CONVERT(date, 0)

Производит

Явное преобразование из типа данных int в дату не допускается.

Потому что это не поддерживаемое преобразование

в то время как

SELECT CONVERT(datetime, 0)

Возвращает

01 января 1900 00:00:00

Так что да, это странно и произвольно, но на самом деле задокументировано и объяснимо.


Комментарии не для расширенного обсуждения; Разговор об этом ответе был перенесен в чат .
Пол Уайт говорит GoFundMonica

2
CAST('' AS INT)Задокументировано ли где-нибудь поведение -> 0? Было бы неплохо, если бы вы добавили ссылку.
Салман А

2
@SalmanA: Это должно быть задокументировано в разделе «Преобразование символьных данных» документации char / varchar , но в настоящее время это не так. Я оставил комментарий обратной связи с просьбой включить его.
Хайнци
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.