我有一个查询,其中有多个基于参数的条件
select a,b,c,d from xyz where case p='Closed' then (q-r)=0 case p='Pending' then (q - isnull(r,0) )>0 case P='All' then all records to be display
它给出了行近语法错误
请建议我任何其他解决方案来改变‘条件’取决于参数值,
因为在给定的 SQL 中,'在哪里'条件取决于参数p值。
您可以看到,在给定的语法中,如果参数值发生变化,条件也会发生变化。
在第一种情况下,如果 p='Closed',那么select ... where q-isnull(r,0)=0
如果 p='待定' 那么select ... where (q - isnull(r,0) )>0
在第一种情况下,它正在比较'等于'条件&在下一个例子中'比...更棒'零值。
就像在第三种情况下我想显示所有记录。
这里的问题是,“case”结构仅返回一个值,而不是表达式。
答案1
如果您希望在 case 语句中评估多个标准,那么您所要做的就是将它们全部移至 THEN 之前,并返回一个指示它通过检查的值。
对于您的代码,可以这样做:
select a,b,c,d from xyz where 1 =
case p='Closed' and (q-r)=0 then 1
case p='Pending' and (q - isnull(r,0) )>0 then 1
case P='All' then 1
虽然您的语法不适用于 SQL Server(我不确定您正在查询哪个数据库)。 SQL Server 中的工作版本将是:
select a,b,c,d from xyz where 1 =
CASE
WHEN p='Closed' AND (q-r)=0 THEN 1
WHEN p='Pending' AND (q - isnull(r,0) )>0 THEN 1
WHEN P='All' THEN 1
ELSE 0
END