2015-10-13 19 views
2

我已经运行下面的代码,但NULL不显示在最终的查询结果。 我可以看到NULL被插入临时表中。当我在查询中调用变量时,NULL值不显示。表变量和NULLS

USE [AdventureWorks2014]; 
GO 

SET NOCOUNT ON; 
SET STATISTICS IO ON; 

DECLARE @values TABLE 
(  
Value VARCHAR(MAX) NULL 
) 

INSERT INTO @values 
VALUES (NULL), ('Black'), ('Blue'), ('Grey'), ('Multi'), ('Red'), ('Silver'), ('Silver'), ('Black'), ('White'), ('Yellow') --SELECT Value FROM @values; 

SELECT Production.Product.Name, Production.Product.ProductNumber, Production.Product.Color, Production.Product.ListPrice, Production.Product.SIZE, Production.Product.[Weight], Production.Product.ProductLine, Production.Product.Class, Production.Product.STYLE, Production.ProductPhoto.ThumbNailPhoto, Production.ProductPhoto.LargePhoto FROM Production.Product INNER JOIN Production.ProductProductPhoto ON Production.Product.ProductID =  Production.ProductProductPhoto.ProductID INNER JOIN Production.ProductPhoto ON Production.ProductProductPhoto.ProductPhotoID =  Production.ProductPhoto.ProductPhotoID 
--BEGIN CALLOUT A 
WHERE --Production.Product.Color IS NOT NULL 
(Production.Product.Color IN (SELECT Value FROM @values)); 
--END CALLOUT A 
GO 

回答

1

IN声明将同样执行(field = val1) OR (field = val2) OR (field = val3)。将NULL放在那里将归结为(field = NULL),这自然不会起作用。这里

WHERE (Production.Product.Color IN (SELECT Value FROM @values)) 
    OR (Production.Product.Color IS NULL) 
+0

小问题:

除了插入NULL@values的,试试这个。如果null未被插入到表变量中怎么办? –

+0

@ t-clausen.dk然后不要添加'OR'部分? –

+0

因此当表变量的内容发生变化时更改sql?有趣的 –

0
SET NOCOUNT ON; 
SET STATISTICS IO ON; 

DECLARE @values TABLE 
(  
Value VARCHAR(MAX) NULL 
) 

INSERT INTO @values 
VALUES (NULL), ('Black'), ('Blue'), ('Grey'), ('Multi'), ('Red'), ('Silver'), ('Silver'), ('Black'), ('White'), ('Yellow') --SELECT Value FROM @values; 

SELECT Production.Product.Name, Production.Product.ProductNumber, Production.Product.Color, Production.Product.ListPrice, Production.Product.SIZE, Production.Product.[Weight], Production.Product.ProductLine, Production.Product.Class, Production.Product.STYLE, Production.ProductPhoto.ThumbNailPhoto, Production.ProductPhoto.LargePhoto 
FROM Production.Product 
INNER JOIN Production.ProductProductPhoto ON Production.Product.ProductID =  Production.ProductProductPhoto.ProductID 
INNER JOIN Production.ProductPhoto ON Production.ProductProductPhoto.ProductPhotoID =  Production.ProductPhoto.ProductPhotoID 
--BEGIN CALLOUT A 
WHERE --Production.Product.Color IS NOT NULL 
(ISNULL(Production.Product.Color,'EMPTY') IN (SELECT ISNULL(Value,'EMPTY') FROM @values)); 
--END CALLOUT A 
GO 
+1

战争食物:答案应该有一些文字来解释代码,或只是文字。只有代码答案可能有助于OP,但对未来的读者来说会更难理解。 (这不是一个downvote,只是一个建议) –

0

使用INTERSECT

WHERE 
    exists (SELECT Production.Product.Color INTERSECT SELECT Value FROM @values)