人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL(oracle)について教えてください。
下記のようなデータがあります。

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

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

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

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




●質問者: wakutan
●カテゴリ:コンピュータ インターネット
✍キーワード:Oracle SQL セミコロン データ リスト
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● bmax
●35ポイント

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

◎質問者からの返答

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

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

CREATE TABLE SAMPLE

(

a VARCHAR2(10) NULL

b VARCHAR2(10) NULL

c VARCHAR2(10) NULL

d VARCHAR2(10) NULL

)

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

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

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

ありがとうございます。


2 ● bmax
●35ポイント

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

では下記の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項目ほどあるので、大変だなとおもっております。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ