Тип данных ответа на запрос CASE изменяется в зависимости от типа данных неиспользованного оператора - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть простой запрос CASE, однако я заметил кое-что удивительное - тип данных, которые возвращает запрос, изменяется в зависимости от того, какой тип данных находится в неиспользуемой (не выбранной) ветви.

Давайте рассмотрим два тематических запроса:

A1:

SELECT
CASE 1 
WHEN 3 THEN '7'
ELSE 'text answer' END
FROM SomeDatabase

B1:

SELECT
CASE 1
WHEN 3 THEN '7'
ELSE float_attribute END
FROM SomeDatabase

Запрос A1 возвратит «тот же» Запрос B1 вернет значение float_attribute (которое имеет тип float - важно!) Пока все хорошо ...

У меня есть проблема, если мы изменим эти запросы так, чтобы условие было выполнено

A2:

SELECT
CASE 1 
WHEN 1 THEN '7'
ELSE 'the same' END
FROM SomeDatabase

B2:

SELECT
CASE 1
WHEN 1 THEN '7'
ELSE float_attribute END
FROM SomeDatabase

Теперь здесь начинается мое заблуждение:

Запрос A2 возвращает 7

Запрос B2 возвращает 7.000000

Несмотря на то, что оба запроса содержат одну и ту же выбранную ветвь КОГДА 1 ТО '7' , запросы возвращают значение другого типа.

Очевидно, что тип зависит от типа значения / атрибута, который находится во второй ветви, даже если он не выбран.

ПОЧЕМУ ЭТО ТАК ?? Это нормальное SQL поведение?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Оператор CASE Возвращает самый высокий тип приоритета из набора типов в result_expressions и необязательного выражения else_result_expression. Для получения дополнительной информации см. Тип данных Приоритет (Transact- SQL) . Ссылка

В вашем случае строка ниже, чем float.

1 голос
/ 08 апреля 2020

Это совсем не удивительно. Выражения CASE возвращают значение single . Это значение имеет указанный тип.

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

Это стандартное поведение. Я уверен, что все данные документируют это как часть объяснения выражения CASE.

...