如何编写SQL查询以获取同一表中的emp名称和manager名称?

时间:2018-10-27 12:01:58

标签: sql sql-server

我有一个Employee表:

Employee

其中EmpID是主键,而ManagerID是外键。

我想要这样的输出,如果manager id为null,则显示“ No Manager”:

Output

我写了这个查询

SELECT 
    e1.EmpID, 
    e1.EmpName, 
    e1.ManagerID,
    ManagerName = CASE 
                     WHEN e1.ManagerID = NULL THEN 'No Manager'
                     ELSE e2.EmpName
                  END
FROM 
    Emp e1
LEFT JOIN 
    Emp e2 ON e1.ManagerID = e2.EmpID;

但是我得到这个输出,我想要'No Manager'代替NULL

wrong output

请帮助

预先感谢

2 个答案:

答案 0 :(得分:3)

请勿将!=NULL一起使用!正确的语法为IS NOT NULL。但是,请使用内置函数COALESCE()

SELECT e1.EmpID, e1.EmpName, e1.ManagerID,
       ManagerName = COALESCE(e2.EmpName, 'No Manager')
FROM Emp e1 LEFT JOIN
     Emp e2
    ON e1.ManagerID = e2.EmpID;

NULL上的几乎所有操作都会返回NULL,包括=<>IS NULLIS NOT NULL是两个突出的例外。

答案 1 :(得分:1)

  

NULL表示未知

尝试使用IS NULL代替= NULL

SELECT 
    e1.EmpID, 
    e1.EmpName, 
    e1.ManagerID,
    ManagerName = CASE WHEN e1.ManagerID IS NULL THEN 'No Manager'
                       ELSE e2.EmpName
                       END
FROM Emp e1 LEFT JOIN Emp e2 ON e1.ManagerID = e2.EmpID;

注意

SET ANSI_NULLS的默认设置为

  

指定在SQL Server 2017中将等于(=)和不等于(<>)比较运算符与空值一起使用时符合ISO的行为。

如果您想使用NULL = NULL,则可以更改设置,尽管我不建议这样做。

这是SET ANSI_NULLS的表

Boolean Expression  SET ANSI_NULLS ON   SET ANSI_NULLS OFF
    NULL = NULL         UNKNOWN             TRUE
    1 = NULL            UNKNOWN             FALSE
    NULL <> NULL        UNKNOWN             FALSE
    1 <> NULL           UNKNOWN             TRUE
    NULL > NULL         UNKNOWN             UNKNOWN
    1 > NULL            UNKNOWN             UNKNOWN
    NULL IS NULL        TRUE                TRUE
    1 IS NULL           FALSE               FALSE
    NULL IS NOT NULL    FALSE               FALSE
    1 IS NOT NULL       TRUE                TRUE