可以在案例陈述中使用“IN”吗?

时间:2015-08-21 19:50:37

标签: sql sql-server tsql reporting-services

我不知道如何表达我的问题,但我会尽力而为。

我正在尝试为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。我需要从子查询中删除该列中的所有内容。

5 个答案:

答案 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
    )

它应该使用Column1TABLE上的任何索引。

如果您的列可以为空,那么任何索引都可能没用,但如果空值在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