SQL:Dynamic Where子句使用IN语句在具有NULL值的记录上死亡

时间:2010-07-27 01:01:24

标签: sql tsql stored-procedures null where-clause

我正在尝试通过网站为我们的数据库实现搜索功能。该数据库有一个主表和五个外键与主键(详细信息表)的表。详细信息表包含可挂起的整数值,这些值挂钩到应用程序中的查找表。我想允许用户从查找表中选择任何/所有值,并将其作为逗号分隔的字符串传递给存储过程。我遇到的问题与记录具有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。

非常感谢人们给予我的任何帮助。

1 个答案:

答案 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。