下記のようなデータがあります。
-----------------------
項目名,値
a,1
b,
c,3
d,
-----------------------
aには1、bにはNULL、cには3、dにはNULL が入っています。
このデータから、NULL以外の項目と値を抜き出し、
下記のような結果を得たいのです。
-----------------------
項目リスト,値リスト
a;c,1;3
-----------------------
各値をセミコロンで連結します。
ここでは簡略化のために項目を4つにしていますが、
実際は、800項目あります。
OracleのバージョンがわかりませんがXMLagg関数が使えるならば以下のSQLで取得できます
SELECT SUBSTR(REPLACE(REPLACE(XMLagg(XMLELEMENT("dummy",項目名)), '</dummy>', '<dummy>'), '<dummy>', ';'), 2) 項目リスト ,SUBSTR(REPLACE(REPLACE(XMLagg(XMLELEMENT("dummy",値)), '</dummy>', '<dummy>'), '<dummy>', ';'), 2) 値リスト FROM テーブル WHERE 値 IS NOT NULL;
10gR2で動作確認
縦に並んでいたので項目名フィールドの値かと勘違いしてしまいました、早とちりですいません。
では下記のSQLを試してみてください。
サンプルとなるテーブル定義は上記コメントのを流用させていただきます。
SELECT REPLACE(REGEXP_REPLACE(XMLFOREST(a, b, c, d),'(^.+?/)|(>.+?<)|($?>)'), '/', ';') COLMUNS_LIST, REGEXP_REPLACE(REGEXP_REPLACE(XMLFOREST(a, b, c, d),'^(<.+?>)|(</.+?>)'),'<.+?>', ';') VALUES_LIST FROM SAMPLE
XMLFORESTで指定項目の項目名と値のセットをXML形式で取得。(もともと値がNULLなら出力されない仕様!)
正規表現を使って不要部分の削除(項目名のリストを作るなら値が不要)と区切り文字の置換を行っています。
http://oracle.se-free.com/dml/12_xmlforest.html
http://www.shift-the-oracle.com/sql/functions/regexp_replace.htm...
項目名は、SQLに記載しないとできないのでしょうか?
800項目ほどあるので、大変だなとおもっております。
表現がわかりにくくてごめんなさい。
項目名は、テーブルの項目名になります。
CREATE TABLE SAMPLE
(
a VARCHAR2(10) NULL
b VARCHAR2(10) NULL
c VARCHAR2(10) NULL
d VARCHAR2(10) NULL
)
この項目名にそれぞれ値がセットされているという状況です。
引き続き回答を募集します。よろしくお願いいたします。
ただこのXMLAGGはとても勉強になりました。
ありがとうございます。