SQL:动态Where子句在具有空值的记录上使用IN语句

SQL:动态Where子句在具有空值的记录上使用IN语句,sql,tsql,stored-procedures,null,where-clause,Sql,Tsql,Stored Procedures,Null,Where Clause,我正试图通过一个网站为我们的数据库实现搜索功能。数据库有一个主表和五个表,它们是主表的外键(详细表)。详细信息表包含可为空的整数值,这些整数值连接到应用程序中的查找表。我希望允许用户从查找表中选择任何/所有值,并将其作为逗号分隔的字符串传递给存储过程。我遇到的问题与记录的空值有关,因为它返回UNKNOWN,所以我无法返回任何行 以下是我希望在where子句中使用的示例: 伪码 Input Variable @StateIDs VARCHAR(MAX) @StateIDs = '1, 2

我正试图通过一个网站为我们的数据库实现搜索功能。数据库有一个主表和五个表,它们是主表的外键(详细表)。详细信息表包含可为空的整数值,这些整数值连接到应用程序中的查找表。我希望允许用户从查找表中选择任何/所有值,并将其作为逗号分隔的字符串传递给存储过程。我遇到的问题与记录的空值有关,因为它返回UNKNOWN,所以我无法返回任何行

以下是我希望在where子句中使用的示例:

伪码

Input Variable
  @StateIDs VARCHAR(MAX)

  @StateIDs = '1, 2, 3' //I have a split function to split this up
    //@StateIDs could have zero or all 50 states in it so this needs to work with either

  WHERE
    State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ','))

    //udf_SplitAndCoalesce is used to split up the csv input parameter and if that is null to return the current value in the record in the table

This works unless @StateIDs = NULL the where clause becomes

    WHERE State.StateID IN (State.StateID)
这很好,除非State.StateID=NULL,然后它变为

WHERE State.StateID IN (NULL)
将返回未知(无行)

如果
@StateIDs
中的csv列表为空,那么我真的不希望Where子句的这一部分出现在那里,但我不知道如何有条件地排除或包含整个语句。最大的问题是大约有20种不同的输入,所以我不能只写两个不同的select语句,一个是当
@StateIDs
不为空时,另一个是当它为空时

我最终尝试创建一个动态where子句,而不使用
sp_executesql
将语句作为字符串执行

我已经为此工作了几天,并创建了一系列不同的解决方案,但每一个都不是我所需要的,它归结为处理NULL


如果有人能给我任何帮助,我将不胜感激。

您必须更新每个WHERE子句,但是您能做类似的事情吗(注意WHERE子句被括号包围)

如果
@StateIDs
为NULL,则
或@StateIDs为NULL
子句将有效地返回所有行,就像IN语句不存在一样,因为整个语句的计算结果将为TRUE

WHERE
    (State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ',')) 
        OR @StateIDs IS NULL)