Sql基于动态where条件

时间:2017-11-07 11:44:49

标签: 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

它在行大小写

附近给出了错误的语法

3 个答案:

答案 0 :(得分:1)

您可以使用多个逻辑对执行此操作,如下所示:

select a,b,c,d 
from xyz 
where 
(p='Closed' AND (q-r)=0)
OR (p='Pending' AND (q - isnull(r,0) )>0)
OR (P='All')

这个想法是其中一个案例是真的,如果是这样的话,它确保它的配对条款也是如此。

答案 1 :(得分:0)

请建议我根据参数值改变'where condition'的其他解决方案,

因为在给定的sql (问题)中,'其中'条件取决于参数 p 值。 您可以在给定的语法中看到,如果参数值发生变化,条件也会发生变化。

在第一种情况下,如果p ='已关闭'则 select ...其中q-isnull(r,0)= 0

如果p ='等待'那么

选择...其中(q - isnull(r,0))> 0

在第一种情况下,它将'等于'条件 &安培;在下一个示例中,'大于'零值。

与第三种情况一样,我想显示所有记录

这里的问题是'case'结构只返回一个值而不是表达式。

答案 2 :(得分:0)

好的,我得到了上述问题的解决方案

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

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

而不是p='Closed' then (q-r)=0 使用p='Closed' AND (q-r)=0 THEN 1