oracle SQL语句返回值,即使不满足where子句- JSON_OBJECTAGG

4ktjp1zp  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(135)

当我在Oracle数据库中运行下面的SQL查询时,即使where子句失败,也会返回值,如何避免这个问题?

SELECT
    '{"load_invoice":'
    || JSON_OBJECTAGG(KEY 'Module' VALUE 'AR')
    || '}'
FROM
    dual
WHERE
    1 = 2;
ggazkfy8

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。

5m1hhzi4

5m1hhzi42#

正如@p3consulting在他们的回答中提到的,问题是你正在聚合整个结果集,即使结果集中没有结果,聚合函数也会返回一行。
考虑:

SELECT COUNT(*) FROM DUAL WHERE 1 = 2;

您会期望返回一个计数为0的单行(而不是不返回任何行);您的查询将是类似的,并返回一行NULL的聚合值。
还有一个问题是,您使用字符串连接构建外部JSON,因此生成的JSON无效。
你需要做的是在整个过程中使用JSON函数:

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

SELECT JSON_OBJECT(
         KEY 'load_invoice' VALUE JSON_OBJECTAGG(KEY 'Module' VALUE 'AR')
       ) AS invoice
FROM   DUAL
HAVING 1 = 2;

它什么也不输出。
fiddle

相关问题