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;



浙公网安备 33010602011771号