Sql server Sql WHERE子句中的大小写和用法

Sql server Sql WHERE子句中的大小写和用法,sql-server,case,Sql Server,Case,我正在编写一份报告,由于数据集的级别不同,我需要根据参数灵活调整 我只想要空的或分级的结果。因此,正常的where子句应该是(x为null或(1,2,3)中的x) 当我试图在案例中实现它时,会出现语法错误 下面是我尝试的,这只是尝试数据集部分,所以我不会在这部分之后硬编码参数值 DECLARE @Type NVARCHAR(30) set @Type = foo select COUNT(A) as A,B,C FROM Activity act inner join x in

我正在编写一份报告,由于数据集的级别不同,我需要根据参数灵活调整

我只想要空的或分级的结果。因此,正常的where子句应该是
(x为null或(1,2,3)中的x)

当我试图在
案例中实现它时,
会出现语法错误

下面是我尝试的,这只是尝试数据集部分,所以我不会在这部分之后硬编码参数值

DECLARE @Type NVARCHAR(30)
set @Type = foo

select COUNT(A) as A,B,C
FROM Activity act
    inner join x
    inner join v
    inner join  y
    inner join  z
where 1=1
and DetailKey = @Type
and cd.Value is null or IN
      CASE @Type 
         WHEN  'foo' THEN ('1','2','3') ELSE 
         WHEN  'bar' THEN ('YR','OR','DR') END

编辑:由于简短,示例中省略了连接,它们不是问题。

不可能将值列表作为
大小写表达式的谓词。但您可以将
WHERE
子句改写如下:

WHERE
    1 = 1 AND       -- not sure if this is needed
    DetailKey = @Type AND
    (cd.Value IS NULL OR
     (@Type = 'foo' AND cd.Value IN ('1','2','3')) OR
     (@Type = 'bar' AND cd.Value IN ('YR', 'OR', 'DR')))

不可能将值列表作为
大小写
表达式的谓词。但您可以将
WHERE
子句改写如下:

WHERE
    1 = 1 AND       -- not sure if this is needed
    DetailKey = @Type AND
    (cd.Value IS NULL OR
     (@Type = 'foo' AND cd.Value IN ('1','2','3')) OR
     (@Type = 'bar' AND cd.Value IN ('YR', 'OR', 'DR')))

那么,您能否发布完整的查询,以便我们指出哪里是错误的?语法错误时的情况也是如此
1=1
的含义是什么?这只是增加了处理时间,没有任何好处。1=1使我在测试许多不同的where子句时更加容易。实际代码没有真正的好处。请明确-
CASE
是一个表达式。它生成一个标量值(每行)。它不允许您任意重构SQL语句的结构。那么,您能否发布完整的查询,以便我们指出哪里出错?语法错误时的情况是什么
1=1
?这只是增加了处理时间,没有任何好处。1=1使我在测试许多不同的where子句时更加容易。实际代码没有真正的好处。请明确-
CASE
是一个表达式。它生成一个标量值(每行)。它不允许您任意重构SQL语句的结构。