我有一个表,它有一个自己的外键来跟踪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
。
任何帮助都会很棒。
答案 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