Запрос SQL Server с IN (NULL) не работает - PullRequest
4 голосов
/ 05 января 2012

Когда я определяю «Определяемый пользователем тип таблицы», как:

CREATE TYPE [dbo].[BitType] AS TABLE(
    [B] [bit] NULL
)

Я ставлю 0 и ноль в этой табличной переменной.Затем я делаю этот запрос:

SELECT something FROM theTable WHERE item IN @theBitTypeTable

Будет только получать item=0 не item is null

Проще говоря: SELECT something FROM theTable WHERE item IN (0, NULL) не работает (без ошибок, хотя) Это должно быть SELECT something FROM theTable WHERE item=0 OR item IS NULL

Итак, мой вопрос, если я хочу использовать Определяемый пользователем тип таблицы , но мне также нужно использовать значение NULL.Как правильно выполнить запрос, чтобы получить результат, включающий нулевой элемент.

Спасибо (кстати, я использую MS SQL Server 2008 R2)

Ответы [ 3 ]

5 голосов
/ 05 января 2012

Единственными допустимыми операциями сравнения со значениями NULL являются IS NULL или IS NOT NULL, другие всегда возвращают false (на самом деле - неизвестно, см. Комментарий @ Damien_The_Unbeliever)

Итак, попробуйте следующее

CREATE TYPE [dbo].[BitType] AS TABLE(
    [B] [tinyint] NOT NULL
)
GO
declare @theBitTypeTable BitType

insert @theBitTypeTable
VALUES(0), (2 /* instead of NULL*/)

SELECT something FROM theTable WHERE IsNull(cast(item as tinyint), 2) IN (select B from @theBitTypeTable)
4 голосов
/ 05 января 2012

Нуль не равен нулю в SQL Server (и большинстве других систем управления базами данных).Вам нужно будет объединить объединенный столбец и использовать значение Sentinel для представления пустых значений.

1 голос
/ 05 января 2012

Существует читерское использование isnull для сравниваемого предмета.

например

SELECT something 
FROM theTable 
WHERE ISNULL(item,0) IN (0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...