SQL(oracle)について教えてください。

下記のようなデータがあります。

-----------------------
項目名,値
a,1
b,
c,3
d,
-----------------------

aには1、bにはNULL、cには3、dにはNULL が入っています。
このデータから、NULL以外の項目と値を抜き出し、
下記のような結果を得たいのです。

-----------------------
項目リスト,値リスト
a;c,1;3
-----------------------

各値をセミコロンで連結します。
ここでは簡略化のために項目を4つにしていますが、
実際は、800項目あります。


回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2008/06/25 10:20:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:bmax No.1

回答回数67ベストアンサー獲得回数16

ポイント35pt

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で動作確認

http://oracle.se-free.com/dml/12_xmllagg.html

id:wakutan

表現がわかりにくくてごめんなさい。

項目名は、テーブルの項目名になります。

CREATE TABLE SAMPLE

(

a VARCHAR2(10) NULL

b VARCHAR2(10) NULL

c VARCHAR2(10) NULL

d VARCHAR2(10) NULL

)

この項目名にそれぞれ値がセットされているという状況です。

引き続き回答を募集します。よろしくお願いいたします。

ただこのXMLAGGはとても勉強になりました。

ありがとうございます。

2008/06/18 15:55:29
id:bmax No.2

回答回数67ベストアンサー獲得回数16

ポイント35pt

縦に並んでいたので項目名フィールドの値かと勘違いしてしまいました、早とちりですいません。

では下記の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...

id:wakutan

項目名は、SQLに記載しないとできないのでしょうか?

800項目ほどあるので、大変だなとおもっております。

2008/06/21 17:10:01
  • id:bmax
    *は使えませんので、項目名は記載する必要があります。

    CASEやNVLを使用してNULLの項目を取り除き、各項目を結合するわけではないので、
    XMLFOREST()の部分に、DESCした結果を貼り付けるのではダメでしょうか?
    (カンマだけはテキストエディタなどで編集する必要はありますが)

    複数のテーブルに対して同様の操作を行う予定で、
    その都度 項目名の指定をするのが面倒ということであれば
    PL/SQL FUNCTIONを作成するなどの方法をとるのが良いと思います

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません