允许null参数作为SQL Select中的参数

时间:2015-01-09 00:17:59

标签: sql-server-2008

我有一个表,它有一个自己的外键来跟踪ParentID。这用于在数据库中创建树状层次结构。我正在尝试创建一个函数,它将查找具有特定ParentID的所有行。但是,如果记录是根记录,则它的父级为NULL。因此,如果我想查找所有根表,我还需要输入NULL作为选项。到目前为止我所拥有的是:

SELECT * FROM X.Y 
    WHERE 
        CASE 
            WHEN @ParentID IS NULL THEN ParentID IS NULL 
            WHEN @ParentID IS NOT NULL THEN ParentID = @ParentID 
        END

我认为我走在正确的轨道上,但还没弄明白。它是Incorrect syntax near the keyword 'IS'表示IS中的THEN ParentID IS NULL

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

你很亲密。试试这个:

SELECT * FROM X.Y 
WHERE (@ParentID IS NULL AND ParentID IS NULL )
   OR (ParentID = @ParentID )

关于我的WHERE语句中的第一个子句:任何与NULL或值为NULL的字段的比较都将返回false。即使WHERE NULL = NULL也会评估为假。

因此,如果您想说,“如果我的变量和字段本身都为空,请执行此操作”,您需要使用WHERE (@ParentID IS NULL AND ParentID IS NULL )之类的内容。

有些人喜欢这样做:

WHERE (ISNULL(@ParentID,0) = ISNULL(ParentID,0)

它很整洁,但它不允许查询引擎利用您可能在表上拥有的索引。这被认为是一个坏主意。

答案 1 :(得分:0)

尝试将第二个WHEN替换为ELSE或仅使用或类似

SELECT * FROM X.Y 
WHERE ParentID IS NULL OR ParentID = @ParentID