基于动态where条件的Sql

基于动态where条件的Sql

我有一个查询,其中有多个基于参数的条件

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

相关内容