【发布时间】: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 设置是否正确。而你多次重复这个基本错误。
-
感谢您指出这一点。诚然,我这样做只是为了解决如果数据不存在,它在标题下不显示任何内容的问题。