Reputation:
I have run the below code but NULL do not show in the final query result. I can see that the NULL were inserted in the temp table. When I call the variable in the query, NULL values do not show up.
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
Upvotes: 2
Views: 2134
Reputation: 44316
Use INTERSECT
WHERE
exists (SELECT Production.Product.Color INTERSECT SELECT Value FROM @values)
Upvotes: 0
Reputation: 489
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
Upvotes: 0
Reputation: 34581
An IN
statement will be executed identically to (field = val1) OR (field = val2) OR (field = val3)
. Putting a NULL
in there will boil down to (field = NULL)
, which naturally won't work.
Instead of inserting a NULL
into @values
, try this:
WHERE (Production.Product.Color IN (SELECT Value FROM @values))
OR (Production.Product.Color IS NULL)
Upvotes: 1