首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中,当没有要导出的值时,如何输出"NULL“而不是”不显示结果“

在SQL中,当没有要导出的值时,如何输出"NULL“而不是”不显示结果“
EN

Stack Overflow用户
提问于 2022-03-03 03:06:08
回答 2查看 309关注 0票数 3

现在使用MySQL v8.0。

问题是:

编写一个SQL查询,从Employee表中报告第二高薪资的id和薪资。如果没有第二个最高薪资,则查询应报告null。

我的虚拟数据是:

代码语言:javascript
复制
Create table If Not Exists Employee (id int, salary int);
insert into Employee (id, salary) values 
(1, 100);

我的理想输出如下:

代码语言:javascript
复制
+------+--------+
|  id  | salary |
+------+--------+
| NULL |  NULL  |
+------+--------+

我使用DENSE_RANK作为解决这个问题的更直接的方法:

代码语言:javascript
复制
WITH sub AS (SELECT id,
       salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS num
       FROM Employee )
SELECT id, salary
FROM sub
WHERE num = 2

但是当没有第二高工资的时候,我很难输出NULL。我试过IFNULL,但没成功。我想这是因为输出实际上不是空的,而是空的。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-03 05:43:34

代码语言:javascript
复制
WITH sub AS (
    SELECT id,
           salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS num
    FROM Employee 
)
SELECT id, salary
FROM sub
WHERE num = 2
UNION ALL
SELECT NULL, NULL
WHERE 0 = ( SELECT COUNT(*)
            FROM sub 
            WHERE num = 2 );

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=31f5afb0e7e5dce9c2c128ccc49a6f42

票数 2
EN

Stack Overflow用户

发布于 2022-03-04 00:26:45

在我看来,仅仅将查询作为子查询并从单行生成子查询中退出连接,似乎是最简单的方法:

代码语言:javascript
复制
select id, salary
from (select null) at_least_one_row
left join (
    select id, salary
    from (
        select id, salary, dense_rank() over (order by salary desc) as num
        from Employee
    ) ranked_employees
    where num = 2
) second_highest_salary on true

(与只使用一次的cte相比,我通常更喜欢子查询;我发现这很模糊。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71331658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档