ここで問題点は次のとおりです。サブクエリを使用してXMLAGGを使用して値をリストにロールアップし(出力にHTMLテーブルを生成する) XMLAGGがなければ、サブクエリは(期待通りに)ゼロの行を返しますが、XMLAGGをインクルードすると、XMLAGGの結果がNullであっても行が返されます。これを防ぐための体系的な方法はありますか、またはケースの文ですべてを包み込み、空のときにXMLAGGを実行しないでください。条件は外部クエリと内側クエリのない行に対して一列につながる行を返さないサブクエリでXMLAGGが行を作成しないようにするにはどうすればよいですか?
SELECT 'stuff1' outerquery
, (SELECT TO_CLOB('some text')
|| xmlcast(xmlagg(xmlelement(E, 'text' || table2.data1 || ' text2' || table3.data1) ORDER BY table2.due_date) AS CLOB)
FROM table2
JOIN table3 ON table2.table3_id = table3.table3_id
WHERE [conditions]
) subquery
FROM table1
WHERE [conditions]
:
コードは次のように見えます。これを実行すると、サブクエリには行がなくても「一部のテキスト」部分が表示され、条件を変更せずにXMLAGGを削除すると正しくnullになります。
以前にこの問題に対処した人はいますか?
(私は最終的な結果は、4000文字の上に行くことを期待ので、私は代わりにLISTAGGのXMLAGGを使用しています)
これは、Oracleデータベースです。
テストするために実行する場合は、DUALテーブルを使用してこの動作を実証できました。違いを確認するには、XMLAGG行をコメントアウトしてください。
SELECT 'stuff1' outerquery
, (SELECT TO_CLOB('some text')
|| xmlcast(xmlagg(xmlelement(E, 'text') ORDER BY 1) AS CLOB)
FROM DUAL
WHERE 1=2
) subquery
FROM DUAL
これは有用な情報です。私は設定したデュアルサンプルでグループを使ってテストしましたが、それはうまくいくようです。私は実際のクエリでグループ化するために使用できるカラムを持っていますが、ロジックがすべてのものを取得したり、そのカラムでグループ化することが変わっていないので、これを行うとは思われませんでした。 – ZeroK
私は 'HAVING COUNT(*)> 0'をテストしましたが、これもうまくいくと思われます。 –
@ WumpusQ.Wumbley。 。 。良い情報。私は答えを編集しました。 –