584. Find Customer Referee

发布时间 2024-01-02 03:44:51作者: 我是球啊

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 NULLIS NOT NULL,而不是=<>。因为在SQL中,NULL表示未知的值,它与任何其他值(包括NULL本身)的比较都将返回未知。因此,为了检查列是否为NULL,必须使用IS NULLIS 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;

这SQL查询使用了COALESCE函数,该函数在一组值中返回第一个非NULL值。在这个查询中,COALESCE(referee_id, 0)的作用是,如果referee_id列的值不为NULL,就返回referee_id的实际值;如果referee_id为NULL,则返回0。

然后,查询检查COALESCE(referee_id, 0) <> 2,即检查处理后的referee_id是否不等于2。这将选择referee_id不等于2或者为NULL的记录。

所以,这个查询与之前使用IFNULL函数的查询类似,都是考虑到NULL的情况,将NULL值替换为一个特定的值(这里是0),然后检查是否不等于目标值(这里是2)。最终,它选择了符合条件的记录的name列。

这两种写法的选择通常基于个人或团队的偏好,因为它们在处理NULL值方面提供了类似的功能。