Sql server T-SQL-仅当列表中的值存在时才使用AND条件

Sql server T-SQL-仅当列表中的值存在时才使用AND条件,sql-server,tsql,parameter-passing,case,conditional-statements,Sql Server,Tsql,Parameter Passing,Case,Conditional Statements,只有在从预定义值列表中找到(a)个值时,我才希望在WHERE子句之后的查询中添加AND条件,否则不应添加该条件 我想在这里添加的条件是“AND Table2.fieldvalue=importantvalue”,仅当参数值出现在(1001102200031004100510061007)列表中时 另外,传入的参数是一个字符串,其INT值以逗号分隔,但我有一个用户定义的函数来拆分并将其转换为INT SELECT field1,field2,field3.... from Table1 join

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

我想在这里添加的条件是“AND Table2.fieldvalue=importantvalue”,仅当参数值出现在(1001102200031004100510061007)列表中时

另外,传入的参数是一个字符串,其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

您可以使用嵌套案例:

(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
) 

您可以使用嵌套案例:

(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
) 

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

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

请注意,dbo.func_SplitString返回一个表数据类型。

这在第一次读取时看起来很奇怪,但它可以工作。在搜索SP中,我只考虑具有非空值的参数。当参数非空时,它是来自应用程序的逗号分隔字符串

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

请注意,dbo.func_SplitString返回一个表数据类型。

这是正确的语法,可以实现您想要的。。。如果
Table1.field3
值不存在于列表中(1001001002、1003、1004、1005、1006、1007),则不管
和Table2.fieldvalue=importantvalue
是否为真。。。如果希望得到1作为结果,则这两个条件都应为true。如果我误解了某些内容,请提供示例数据。这是实现您所需的正确语法。。。如果
Table1.field3
值不存在于列表中(1001001002、1003、1004、1005、1006、1007),则不管
和Table2.fieldvalue=importantvalue
是否为真。。。如果希望得到1作为结果,则这两个条件都应为true。如果我误解了什么,请提供示例数据。