Oracle - 查询没有返回结果时显示“无行”

Posted

技术标签:

【中文标题】Oracle - 查询没有返回结果时显示“无行”【英文标题】:Oracle - Display 'No Rows' when query returns no results 【发布时间】:2020-04-01 16:07:35 【问题描述】:

我希望我的 Oracle SQL 输出在查询未返回任何结果时显示“未找到行”。

我正在尝试使用 NVL 功能,但出现错误提示

'第 21 行出现错误:ORA-00907:缺少右括号'

SELECT NVL((
            SELECT TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
                ,COUNT(*)
            FROM APPCHANGEHIST A
                ,DATABASEFIELD D
            WHERE A.CHGFIELD = D.FIELDNUM
                AND trunc(CHGDATE) BETWEEN add_months(to_date(to_char((sysdate - to_char(sysdate, 'dd') + 1), 'dd-mon-yyyy')), - 1)
                    AND to_date(to_char((sysdate - to_char(sysdate, 'dd')), 'dd-mon-yyyy'))
                AND CHGFIELD = 79
                AND OLDVALUE IS NOT NULL
                AND EXISTS (
                    SELECT 1
                    FROM USERPROF
                    WHERE USERID = A.CHGREQUESTOR
                    )
            GROUP BY TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
            ORDER BY 1
                ,4 DESC
            ), "No Rows");

在没有 NVL 的情况下单独运行此语句时没有问题

SELECT TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
                ,COUNT(*)
            FROM APPCHANGEHIST A
                ,DATABASEFIELD D
            WHERE A.CHGFIELD = D.FIELDNUM
                AND trunc(CHGDATE) BETWEEN add_months(to_date(to_char((sysdate - to_char(sysdate, 'dd') + 1), 'dd-mon-yyyy')), - 1)
                    AND to_date(to_char((sysdate - to_char(sysdate, 'dd')), 'dd-mon-yyyy'))
                AND CHGFIELD = 79
                AND OLDVALUE IS NOT NULL
                AND EXISTS (
                    SELECT 1
                    FROM USERPROF
                    WHERE USERID = A.CHGREQUESTOR
                    )
            GROUP BY TO_CHAR(CHGDATE, 'yyyy-mm')
                ,CHGFIELD
                ,DBNAME
            ORDER BY 1
                ,4 DESC

【问题讨论】:

不幸的是,NVL 仅在您的查询为一行返回 NULL 值时才有效。如果它没有返回任何行,您需要一个不同的解决方案。 不相关,但是:add_months(to_date(to_char((sysdate - to_char(sysdate, 'dd') + 1), 'dd-mon-yyyy')), - 1)可以简化为add_months(trunc(sysdate), - 1) 在表示级别(即在您的应用程序中)执行此操作,而不是在 SQL 级别。 顺便说一句,您对日期的处理在很多方面都是错误的。 sysdate 是一个 DATE,所以 'sysdate - to_char(sysdate, 'dd')' 是从 DATE 中减去一个字符串。 Oracle 将尝试正确的类型转换,但这将取决于 NLS 设置是否正确。而你多次重复这个基本错误。 感谢您指出这一点。诚然,我这样做只是为了解决如果数据不存在,它在标题下不显示任何内容的问题。 【参考方案1】:

好的,概括地说,您可以使用以下模式:

WITH results AS
(
  SELECT *
  FROM dual d
  WHERE d.dummy = 'Y'
)
SELECT *
FROM results
UNION ALL
SELECT 'No Rows Found'
FROM dual
WHERE NOT EXISTS (SELECT 'X'
                  FROM results);

您可以通过在“X”和“Y”之间更改 WITH 子句中的值来进行操作。 在您的查询中,您只需将 WITH 子句中的 SELECT 替换为您的查询。

【讨论】:

我应该注意,这仅在当前有效,因为DUAL 只有一列。如果您的 WITH 子句有多个列,则需要匹配 UNION ALL 第二部分中的列数。这可以通过在附加列中添加NULL 来完成。 对不起,我不明白这与我现有的 SQL 有什么关系。 @salazar44 使用您当前的 SQL(有效的,没有 NVL)并替换 SELECT * from DUAL WHERE d.dummy = 'Y'。如果返回行,它们将正常返回。如果没有返回行,则会返回消息“No Rows Found”。 (正如我上面提到的,您需要为“未找到行”查询添加 NULL 列,以便列数与您的其他查询相匹配。

以上是关于Oracle - 查询没有返回结果时显示“无行”的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP MySQL 搜索中未找到结果时显示消息

在运行时显示 SQL Server 查询结果中的数据类型和列大小

当 API 返回空数据时显示警告(Vue.js / Axios)

PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

在oracleEBS界面中查找字段时显示“此处历史记录不可用”,那么我该怎么在值集中查询它呢?

Oracle 10 system 新建用户,赋权connect,再赋权select;结果新建用户可以登陆;但是不能进行select查询