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