【问题标题】:Oracle Sql Select Query Error in Where ConditionOracle Sql 在Where条件下选择查询错误
【发布时间】:2019-12-09 10:09:16
【问题描述】:

假设,我有一个 where 条件为假的查询。在这种情况下,不会打印任何内容。但是如果条件为假,我想打印一些东西。

如何做到这一点?

如果 where 条件为真:

Select ename from emp where empno = '1234';

output
===========
ename   
======   
Jagdish

如果 where 条件为假:

select ename from emp where empno = '545120';

output
================
ename
=================

当 where 条件为 false 时,我想显示“未找到数据”或类似“N/A”的内容。你能帮忙吗

【问题讨论】:

    标签: sql oracle oracle11g plsqldeveloper


    【解决方案1】:

    如果您总是期望最多一行,则可以使用聚合:

    select coalesce(max(ename), 'N/A')
    from emp
    where empno = '1234';
    

    没有group by 的聚合查询总是返回一行。如果所有行都被过滤掉,那么聚合函数会返回null——因此,coalesce() 会得到你想要的。

    注意:这假设 ename 在数据中绝不是 null

    【讨论】:

    • 如果条件为假,则仅显示空值...但我想显示 n/a
    • @Jagadish 。 . .如所写,此查询无法返回null 值。如果名称实际上是一个空字符串,它可能会返回一个空字符串。
    【解决方案2】:

    您可以使用 UNION ALL 和 NOT EXISTS 来做到这一点:

    select ename from emp where empno = ?
    union all
    select 'no data found' from dual 
    where not exists (select 1 from emp where empno = ?);
    

    将两个查询中的 ? 替换为您搜索的值。
    请参阅demo

    【讨论】:

    • 当条件为假时显示正确,但如果条件为真则显示两行.......所以,我可以为此使用联合而不是联合所有。
    • 你在哪里看到 2 行?
    • 您在两个查询中是否使用了相同的 empno?我猜你没有。
    • 那你做错了什么。再次检查演示。您是否照原样复制代码?
    • 是的,当我使用联合时,这将提供我想要的正确数据
    【解决方案3】:

    使用 DUAL 进行 OUTER JOIN 以便始终返回一行:

    SELECT COALESCE(e.ENAME, 'No data found') AS ENAME
      FROM DUAL d
      LEFT OUTER JOIN EMP e
        ON e.EMPNO = '545120';
    

    【讨论】:

      【解决方案4】:

      您可以简单地在您的选择子句中添加CASE 语句:

      select CASE WHEN ename IS NULL THEN  'N/A'
             ELSE ename END as ename
      from emp where empno = '545120'; 
      

      【讨论】:

      • 没有empno = '545120'时查询不返回null。它不返回任何行。
      • 这个查询没有按照我的要求显示正确的结果
      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2019-04-26
      • 2016-01-23
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多