2017-05-03 92 views
1

正如你可以在下面的图片中看到,如果我执行下面的查询,我得到至少10个结果:为什么我不能选择!= Nvarchar?

SELECT TOP (10) [t0].[u_nonreportable] 
FROM [sdidataitem] AS [t0] 
WHERE [t0].[u_nonreportable] IS NULL 

enter image description here

相反,如果我只是这样执行查询,我得到没有结果:

-- Region Parameters 
DECLARE @p0 NVarChar(1000) = 'Y' 
-- EndRegion 
SELECT TOP (10) [t0].[u_nonreportable] 
FROM [sdidataitem] AS [t0] 
WHERE [t0].[u_nonreportable] <> @p0 

enter image description here

如果有结果,其中[u_nonreportable]为空,那么当我说[u_nonreportable]!='Y'?为什么我没有得到任何结果?

注:我在上面的例子中使用LINQPad;不过,我也通过在SSMS中运行SQL查询来确认结果。

+2

因为在SQL NULL永远不会等于任何东西......并且它也不等于任何东西。因为它是NULL,它意味着未知,因此知道或不知道该值实际上是否是“Y”在逻辑上是不可能的。 –

回答

6

答案在于SQL Server中NULL的语义。 NULL = NULLNULL != NULL都是错误的。所以,当你说[u_nonreportable] != 'Y'时,当[u_nonreportable]NULL时,结果是错误的。

更具体地说,当ANSI_NULLS设置为ON,即the default并且很快只是值时,上述语义成立。

+0

很好的答案,非常有趣。所以,就我而言,我可能想检查它是否为空,然后检查它是否与Y不相等,如'[u_nonreportable]!= null和[u_nonreportable]!='Y''这样就会短路if它是空的? – user1477388

+1

试试这个:WHERE ISNULL([t0]。[u_nonreportable],'N')<> @ p0 –

+2

这两个都是'unknown'而不是'false'。如果他们错误地把“不”放在他们面前,就会使他们成为现实。 SQL使用[三重逻辑](https://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/) –

相关问题