我有 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