【问题标题】:T-SQL - Using AND condition only if a value from a list is presentT-SQL - 仅当存在列表中的值时才使用 AND 条件
【发布时间】:2016-04-11 20:02:49
【问题描述】:

只有当我从预定义值列表中找到 (a) 个值时,我才想在 WHERE 子句之后的查询中添加一个 AND 条件,否则不应添加该条件。

我要在此处添加的条件是“AND Table2.fieldvalue = importantvalue”,仅当参数值存在于 (1001, 1002, 1003, 1004, 1005, 1006, 1007) 的列表中时

另外传入的参数是一个字符串,其中 INT 值以逗号分隔,但我有一个用户定义的函数来拆分并将其转换为 INT

SELECT field1,field2,field3....
from Table1 
join Table2 ON Table1.somefield = Table2.somefield
WHERE Table1.field1 = value 
AND Table2.field2 = value
AND ( CASE WHEN @parameter IN ( 1001, 1002, 1003, 1004, 1005, 1006, 1007) AND Table2.fieldvalue = importantvalue THEN 1
           ELSE 0
      END ) = 1 AND Table2.somethingelse    
GROUP BY blah,blah,blah..
HAVING blah,blah

【问题讨论】:

  • 这是实现您想要的正确语法...如果Table1.field3 值在列表中不存在 (1001, 1002, 1003, 1004, 1005, 1006, 1007) 它不在乎@987654323 @ 是否为真...如果您想获得 1 作为结果,则这两个条件都应该为真。如果我误解了某些内容,请提供示例数据。

标签: sql-server tsql parameter-passing case conditional-statements


【解决方案1】:

这看起来很奇怪,但它确实有效。我在搜索 SP 中有这个,只考虑具有非 NULL 值的参数。当参数为非NULL时,它是来自应用程序的逗号分隔字符串。

WHERE ..................
AND (MyTable.MyColumn IN (SELECT * FROM dbo.func_SplitString(@Parameter, ',')) OR @Parameter IS NULL)

请注意,dbo.func_SplitString 返回 TABLE 数据类型。

【讨论】:

    【解决方案2】:

    您可以使用嵌套案例:

    (CASE WHEN Table1.field3 IN ( 1001, 1002, 1003, 1004, 1005, 1006, 1007) 
        THEN (CASE WHEN Table2.fieldvalue = importantvalue THEN 1 ELSE 0 END)
        ELSE 1
    END ) = 1
    

    您甚至可以将其设为单一条件,但请注意 NOT IN 处理空值的方式:

    (
        Table2.fieldvalue = importantvalue OR 
        Table1.field3 NOT IN ( 1001, 1002, 1003, 1004, 1005, 1006, 1007) OR
        Table1.field3 IS NULL
    ) 
    

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2016-10-19
      相关资源
      最近更新 更多