我不知道如何表达我的问题,但我会尽力而为。
我正在尝试为SSRS中的报告完成类似的事情。
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE COLUMN1 =
CASE
WHEN @VAR1 IS NOT NULL THEN @VAR1
WHEN @VAR1 IS NULL THEN IN (SELECT COLUMN1 FROM TABLE2)
END
如何重写我的case语句以允许这种类型的逻辑?我应该以不同的方式写作吗?
我知道这个问题可以解释为一个开放式问题,但我会在测试后立即将答案标记为答案,并且它对我有效。
提前致谢。
修改
Table2中的Column1在Column中有NULL。我知道'IN'不会产生NULL。我需要从子查询中删除该列中的所有内容。
答案 0 :(得分:6)
不 - 您不能按照自己的意愿使用IN。你只需稍微重新研究两种可能性。
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE (@VAR1 IS NOT NULL AND COLUMN1 = @VAR1) OR
(@VAR1 IS NULL AND COLUMN1 IN (SELECT COLUMN1 FROM TABLE2) )
对于NULL:
要匹配NULLS,您可以尝试:
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE (@VAR1 IS NOT NULL AND COLUMN1 = @VAR1) OR
(@VAR1 IS NULL AND
(COLUMN1 IN (SELECT COLUMN1 FROM TABLE2)
OR COLUMN1 IS NULL) ) )
答案 1 :(得分:2)
这个怎么样:
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE COLUMN1 in
(SELECT distinct Coalesce(@VAR1, TABLE2.COLUMN1) FROM TABLE2
UNION SELECT @VAR1 --In case it is possible TABLE2 is empty
)
它应该使用Column1
中TABLE
上的任何索引。
如果您的列可以为空,那么任何索引都可能没用,但如果空值在TABLE2
中,则可以使用以下值返回带有空值的记录:
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE COLUMN1 in
(SELECT distinct Coalesce(@VAR1, TABLE2.COLUMN1) FROM TABLE2
UNION SELECT @VAR1
)
OR
(COLUMN1 IS NULL
AND EXISTS(SELECT distinct TABLE2.COLUMN1 FROM TABLE2
WHERE TABLE2.COLUMN1 IS NULL
)
答案 2 :(得分:1)
最好创建一个存储过程来处理这个问题,使用动态sql可以获得更好的性能,使用WHERE @Var is NULL or <Other Expression>
会导致执行计划不佳并且查询性能降低。
CREATE PROCEDURE My_Proc
@Var1 INT = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = N'SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE 1 = 1'
+ CASE WHEN @VAR1 IS NOT NULL
THEN N'AND Column1 = @VAR1 '
WHEN @VAR1 IS NULL
THEN N'AND Column1 IN (SELECT COLUMN1 FROM TABLE2)'
END
Execute sp_executesql @Sql
,'@Var1 INT '
,@Var1
END
答案 3 :(得分:1)
这是皮肤猫的另一种方式:
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE
WHERE 1 =
CASE
WHEN @VAR1 IS NOT NULL AND COLUMN1 = @VAR1 THEN 1
WHEN @VAR1 IS NULL AND COLUMN1 IN (SELECT COLUMN1 FROM TABLE2) THEN 1
--WHEN @VAR1 = COLUMN3 AND COLUMN1 != COLUMN2 THEN 0 /*example*/
ELSE
END
我发现这让我更容易理解,我可以更轻松地使用逻辑。
答案 4 :(得分:0)
如果你想要的是输入参数默认为“all”,当它为null时(通常是当用户从网站上的列表中选择时),你应该这样做:
COLUMN1 = COALESCE(@VAR1,COLUMN1)
或在sql server中具体
COLUMN1 = ISNULL(@VAR1,COLUMN1)
如果您需要将column1“限制”为另一个表中的值,则包括该表的内部联接
JOIN TABLE2 ON TABLE.COLUMN1 = TABLE2.COLUMN1