В сравнении с условиями поиска сравнения - PullRequest
2 голосов
/ 22 июля 2011

Я понимаю, что WHERE 1 = '1' возвращает значение true, а также WHERE 222 = CONVERT(varchar, 222) возвращает значение true в T-SQL.

Но могут ли при работе с IN выражения test_expression и подзапрос иметь разные типы данных?Например, может ли test_expression быть int и подзапросом varchar?

1 Ответ

0 голосов
/ 22 июля 2011

Они могут быть: все типы данных будут преобразованы в наивысшие значения в соответствии с правилами " приоритет типов данных ".

Логически, x in (a,b,c) на самом деле x=a or x=b or x=c конечно.Это актуально для этого надуманного случая с использованием скалярных значений.Я действительно не знаю , являются ли все значения CAST для плавания (самое высокое здесь) перед сравнением (..IN..) или приведением к сравнению (..OR..OR..)

WHERE
  CAST(1 AS int) IN ('1', CAST(1.0 AS float), 1.0 /*decimal*/)

Дляподзапрос в предложении IN, тогда столбец имеет тип данных CAST в соответствии со скалярными правилами

Правка после комментария:

Все типы данных будутнеявно CAST

SELECT TOP 1 *
FROM sys.columns
WHERE
    1 IN (SELECT CAST('1' AS CHAR(1)) FROM sys.columns)

или

DECLARE @intvar int = 1, @charvar char(1) = '1';

SELECT TOP 1 *
FROM sys.columns
WHERE
    @intvar IN (SELECT @charvar FROM sys.columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...