Чому 0 дорівнює порожньому рядку?


23

Мені потрібна допомога у пошуку того, чому наступне T-SQLтвердження повертається 1(правда):

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

Я думаю, хтось змінив такий ANSIваріант, як SET ANSI_NULLSщось інше, що спричиняє поведінку.

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

Відповіді:


31

Це лише документально підтверджена поведінка. Я не думаю, що хтось заплутався з налаштуваннями.

Дивіться пріоритет типу даних на MSDN.

Коли оператор поєднує два вирази різних типів даних, правила для пріоритету типу даних визначають, що тип даних із нижчим пріоритетом перетворюється на тип даних з більш високим пріоритетом.

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

EDIT: Я думаю, що ваша реальна проблема полягає в тому, що ваша конструкція така, що вам доведеться приєднуватися до полів іншого типу даних. Єдиний спосіб подолати це - зробити конверсію на приєднаному пункті, що пошкодить продуктивність запитів. Основна проблема, мабуть, у дизайні схеми

EDIT: У коментарях, які були переміщені до чату, було багато дискусій. Як би нелогічно це не здавалося, перетворення порожнього рядка в інші типи даних створює довільні значення.

Цей код:

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.