584. Find Customer Referee
https://leetcode.com/problems/find-customer-referee/
选出推荐人id不为2的customer
SELECT name FROM Customer WHERE referee_id != 2 OR referee_id IS NULL;
注意:由于 SQL 的三值逻辑,如果条件只是 WHERE referee_id <> 2,则返回不出 referee_id 为 null 的顾客。此外,如果将条件写成 referee_id = NULL 同样也是错误的,因为判断空值必须使用 IS NULL/IS NOT NULL。
SQL中的三值逻辑,其中的三个值是真(True)、假(False)和未知(Unknown)。当使用referee_id <> 2
时,如果referee_id
为NULL,那么这个条件的结果是未知,而不是真或假。因此,如果只使用<>
操作符,不包括NULL的记录可能被排除在外,因为未知的条件不满足真条件。
另外,判断NULL值的条件应该使用IS NULL
或IS NOT NULL
,而不是=
或<>
。因为在SQL中,NULL
表示未知的值,它与任何其他值(包括NULL本身)的比较都将返回未知。因此,为了检查列是否为NULL,必须使用IS NULL
或IS NOT NULL
。
此处NULL与2进行比较结果是NULL,无法返回true或者false。所以必须增加IS NULL的判断。
第二种解法:子查询
SELECT name FROM customer WHERE id NOT IN (SELECT id FROM customer WHERE referee_id = 2);
第三种解法:
SELECT name FROM customer WHERE IFNULL(referee_id, 0) <> 2;
IFNULL(referee_id, 0)
: 这部分使用IFNULL
函数。如果referee_id
列的值为NULL,它会返回第二个参数的值,否则返回referee_id
的实际值。在这里,如果referee_id
为NULL,就会使用0替代。这样,查询就会考虑到NULL的情况,将NULL值替换为0。
第四种解法:
SELECT name FROM customer WHERE COALESCE(referee_id, 0) <> 2;