SQL CASE IN() statement



我有 3 个参数,我想在一定条件下将它们变成 where 子句。

我正在尝试写以下内容;当sum of @p1, @p2 and @p3 equals -3. 我想返回所有行;

当总和是任何其他值时,我想返回落在IN(@p1, @p2, @p3)中的行

我已经尝试了以下内容,但不断看到语法错误,我搜索的任何内容都与我想要做的事情相近。

任何帮助将不胜感激:

@p1 INT = -1
@p2 INT = -1,
@p3 INT = -1
SELECT *
FROM table1
WHERE
(
CASE WHEN @p1 + P2 + @p3 = -3 THEN True ELSE field1 END
IN( CASE WHEN @p1 + P2 + @p3 = -3 THEN True ELSE @p1. @p2, P3 END )
)

在 SQL 中CASE是一个返回单个标量值的表达式。它不能像在过程语言中那样用于控制执行流。

您可以改为尝试此操作:

WHERE (@p1 + P2 + @p3 = -3) 
      OR
      (myField IN (@p1, @p2, @p3))   

正如其他人已经指出的那样,这里不需要使用大小写表达式,只要使用适当的 where 表达式,您就会有更好的解决方案。

案例表达式只是基于一个或多个条件返回值的一种方式。您实际上可以在 where 子句上使用它们,您只需要管理返回的值。

只是为了好玩:

WHERE CASE WHEN @p1 + @p2 + @p3 = -3
           THEN 0
           ELSE CASE WHEN myField IN (@p1, @p2, @p3)
                     THEN 0
                     ELSE 1 END END = 0
@p1 INT = -1
@p2 INT = -1,
@p3 INT = -1
SELECT *
FROM table1
WHERE (@p1 + P2 + @p3 = -3) OR ((@p1 + P2 + @p3 <> -3) AND field1 in (@p1, @p2, P3))
IF (@p1 + @p2 + @p3) = -3 THEN
  SELECT * FROM table1
ELSE
  SELECT * FROM table1
  WHERE field1 IN (@p1, @p2, @p3)
大小

写在 where 不方便

declare @p1 INT = -1, @p2 INT = 2, @p3 INT = -4, @s int = -3;
select @p1, @p2, @p3, @s, @p1 + @p2 + @p3;
declare @tf bit  = (select iif(@p1 + @p2 + @p3 = @s, 1, 0));
declare @T table (pk int identity primary key, fk int);
insert into @T (fk) values (-1), (5), (6)
SELECT *
FROM @T t
WHERE @p1 + @p2 + @p3 = @s 
   OR t.fk in (@p1, @p2, @p3)
SELECT *
FROM @T t
WHERE @tf = 1
   OR t.fk in (@p1, @p2, @p3)
set @p2 = 5;
SELECT *
FROM @T t
WHERE @p1 + @p2 + @p3 = @s 
   OR t.fk in (@p1, @p2, @p3)
pk          fk
----------- -----------
1           -1
2           5
3           6
pk          fk
----------- -----------
1           -1
2           5
3           6
pk          fk
----------- -----------
1           -1
2           5

最新更新