我正在尝试通过网站为我们的数据库实现搜索功能。该数据库有一个主表和五个外键与主键(详细信息表)的表。详细信息表包含可挂起的整数值,这些值挂钩到应用程序中的查找表。我想允许用户从查找表中选择任何/所有值,并将其作为逗号分隔的字符串传递给存储过程。我遇到的问题与记录具有NULL值有关,因为它返回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)
将返回UNKNOWN(无行)
如果@StateIDs
中的csv列表为null,那么我真的不希望Where子句的那一部分存在,但我不知道有条件地排除或包含整个语句的方法。最大的问题是有大约20种不同的输入是可能的,所以当@StateIDs
不为空时,我不能只写一个两个不同的select语句,而当它是一个时,我不能写一个。
我最终尝试创建一个动态where子句,而不使用sp_executesql
将该语句作为字符串执行。
我一直在研究这个问题几天,并创建了许多不同的解决方案,但每个解决方案都不是我需要的,它归结为处理NULL。
非常感谢人们给予我的任何帮助。
答案 0 :(得分:2)
你必须更新每个WHERE子句,但是你可以做这样的事情(注意WHERE子句被括号括起来)?
WHERE
(State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ','))
OR @StateIDs IS NULL)
如果@StateIDs
为NULL,OR @StateIDs IS NULL
子句将有效地返回所有行,就像IN语句不存在一样,因为整个语句将计算为TRUE。