不在sql server中的运算符不工作

时间:2018-05-10 04:52:34

标签: sql sql-server

我正在解决hackerranks二叉树问题.PFB问题

您将获得一个表BST,其中包含两列:N和P,其中N表示二叉树中节点的值,P表示N的父节点。

编写查询以查找按节点值排序的二叉树的节点类型。为每个节点输出以下内容之一:

Root: If node is root node.
Leaf: If node is leaf node.
Inner: If node is neither root nor leaf node.

我能够使用以下查询解决此问题

select n,
 case 
 when p is null then 'Root'
 when p is not null and (n in (select p from BST)) then 'Inner' else 'Leaf'
end
from BST order by n

但在此之前,我正在尝试以下无效的查询

select n,
 case 
 when p is null then 'Root'
 when p is not null and (n in (select p from BST)) then 'Inner'
 when p is not null and (n not in (select p from BST)) then 'Leaf'
end
from BST order by n

上面的查询给出了根音符和内部节点但是它没有叶子给出null,有人可以解释为什么它会显示这种行为。

您可以尝试问题here

三江源

4 个答案:

答案 0 :(得分:4)

这是因为sql如何处理INNOT IN查询。

NOT IN为列表中的每个元素计算!=子句,列表(列p)包含NULL值。因此,value!= NULL计算为UNKNOWN。

重复:NOT IN clause and NULL values

试试这个:

select n,
 case 
 when p is null then 'Root'
 when p is not null and (n in (select p from BST)) then 'Inner'
 when p is not null and (n not in (select p from BST where p IS NOT null)) then 'Leaf'
end
from BST order by n

这应该给出预期的结果。

答案 1 :(得分:1)

以下是NULLnot in一起使用时行为的良好工作示例:

select 
case 
  when NULL not in ('a','b') then 'not in'
  when NULL in ('a','b') then 'in'
  else 'What?' 
end

这会返回What?,这可能看起来很意外。

答案 2 :(得分:0)

学习将not exists与子查询一起使用,而不是not in。它具有正确的语义,因此您不太容易出错。

您可以将case表达式编写为:

select n,
       (case when p is null then 'Root'
             when exists (select 1 from BST bst2 where bst2.p = bst.n)
             then 'Inner' 
             else 'Leaf'
        end)
from BST
order by n;

请注意,我还简化了case表达式。您不需要重复这些条件,因为case表达式按顺序进行评估。

答案 3 :(得分:0)

因此,您可以尝试尝试使用“ NOT NULL”和“ AND”代替。

选择N, B.p为NULL的情况下,则'Root' 当B.N IN(从BST中选择p),然后选择“内部” 否则“叶” 结束案例 从BST B到N;