2017-05-03 91 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/) –

相關問題