2016-08-08 8 views
0

ここで問題点は次のとおりです。サブクエリを使用して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 

答えて

1

xmlagg()に特定されていません。どのデータベースでも、集計関数を持つ問合せは集約問合せです。 group byがない場合、クエリは常に1つの行を返します。これは一般にSQLのプロパティです。

あなたは何ができますか?

GROUP BYを追加できます。一致がなければ行を返しません。 SELECTでサブクエリを使用している場合、これは難しいことです。

サブクエリとWHERE句を使用して、値が見つかるかどうかを確認できます。

HAVING句:HAVING COUNT(*) > 0を使用することもできます。これがすべてのデータベースで動作するかどうかはわかりません。

+0

これは有用な情報です。私は設定したデュアルサンプルでグループを使ってテストしましたが、それはうまくいくようです。私は実際のクエリでグループ化するために使用できるカラムを持っていますが、ロジックがすべてのものを取得したり、そのカラムでグループ化することが変わっていないので、これを行うとは思われませんでした。 – ZeroK

+1

私は 'HAVING COUNT(*)> 0'をテストしましたが、これもうまくいくと思われます。 –

+0

@ WumpusQ.Wumbley。 。 。良い情報。私は答えを編集しました。 –

関連する問題