当我在Oracle数据库中运行下面的SQL查询时,即使where子句失败,也会返回值,如何避免这个问题?
SELECT '{"load_invoice":' || JSON_OBJECTAGG(KEY 'Module' VALUE 'AR') || '}' FROM dual WHERE 1 = 2;
ggazkfy81#
您正在使用不带GROUP BY的聚合FUNCTION:
SELECT '{"load_invoice":' || JSON_OBJECTAGG(KEY 'Module' VALUE 'AR') || '}' FROM dual WHERE 1 = 2 GROUP BY 1 ;
返回空结果。GROUP BY的存在会更改过滤的应用方式:生成执行计划将向您展示差异。这是一个有趣的情况,但相当人为,在一个“真实的的”表中选择更多的列将返回一个ORA-00937。
5m1hhzi42#
正如@p3consulting在他们的回答中提到的,问题是你正在聚合整个结果集,即使结果集中没有结果,聚合函数也会返回一行。考虑:
SELECT COUNT(*) FROM DUAL WHERE 1 = 2;
您会期望返回一个计数为0的单行(而不是不返回任何行);您的查询将是类似的,并返回一行NULL的聚合值。还有一个问题是,您使用字符串连接构建外部JSON,因此生成的JSON无效。你需要做的是在整个过程中使用JSON函数:
0
NULL
SELECT JSON_OBJECT( KEY 'load_invoice' VALUE JSON_OBJECTAGG(KEY 'Module' VALUE 'AR') ) AS invoice FROM DUAL WHERE 1 = 2;
其输出:| 发票|| --------------|| {“load_invoice”:null}|如果你想返回零行,那么使用HAVING而不是WHERE:
HAVING
WHERE
SELECT JSON_OBJECT( KEY 'load_invoice' VALUE JSON_OBJECTAGG(KEY 'Module' VALUE 'AR') ) AS invoice FROM DUAL HAVING 1 = 2;
它什么也不输出。fiddle
2条答案
按热度按时间ggazkfy81#
您正在使用不带GROUP BY的聚合FUNCTION:
返回空结果。GROUP BY的存在会更改过滤的应用方式:生成执行计划将向您展示差异。这是一个有趣的情况,但相当人为,在一个“真实的的”表中选择更多的列将返回一个ORA-00937。
5m1hhzi42#
正如@p3consulting在他们的回答中提到的,问题是你正在聚合整个结果集,即使结果集中没有结果,聚合函数也会返回一行。
考虑:
您会期望返回一个计数为
0
的单行(而不是不返回任何行);您的查询将是类似的,并返回一行NULL
的聚合值。还有一个问题是,您使用字符串连接构建外部JSON,因此生成的JSON无效。
你需要做的是在整个过程中使用JSON函数:
其输出:
| 发票|
| --------------|
| {“load_invoice”:null}|
如果你想返回零行,那么使用
HAVING
而不是WHERE
:它什么也不输出。
fiddle