- PR -

Decode 関数のパラメータにテーブルデータを使いたい

1
投稿者投稿内容
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-12-01 10:52
お世話になります。

Oracle の Decode 関数に関して皆様のお知恵を拝借したいと思います。
通常、 Decode は以下のように行うと思います。

SELECT NAME "氏名" , SEIBETU
DECODE( SEIBETU , 1 , '男' , '女' ) "性別"
FROM PERSONAL ;

氏名 SEIBETU 性別
--------------------- -------- ----
山田 太郎 1 男
山田 花子 2 女


そして、やりたいのはこの「性別」を別テーブルでマスターとして持たせたいと思っています。
イメージとしては「MASTER_TABLE」のようなテーブルを作成して

KEY CODE VALUE
--- -------- -------
101 1 男
101 2 女

というデータを保持します。

このマスターデータの「CODE」と先ほどのテーブルの「SEIBETU」を比較し、
一致した「VALUE」を表示させたいと思っています。

<補足>
Key というのは性別データのコードとなります。
マスターテーブルなので、他のマスターデータも設定されるため。。。
イメージとしてはこんな感じです。

KEY CODE VALUE
--- -------- -------
101 1 男
101 2 女
102 12 千葉
102 13 東京
102 14 神奈川
103 1 白
103 2 黒
</補足>

実際にはテーブルを Join させて Select すればいいのかな、と思っているのですが
その SQL が思いつきません。
ちなみに、環境は Oracle 9 です。

宜しくお願いいたします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-12-01 11:14
こんな感じでできませんか?

コード:
select
 NAME "氏名",
 (
   select 
     value
   from
     master
   where 
    key = '101' and
    code = PERSONAL.SEIBETU
 ) "性別"
from
 PERSONAL
where 
 ・・・
;


きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-12-01 11:36
もしくは、こんな感じ?

コード:
SELECT
  P.NAME "氏名",
  P.SEIBETU,
  M.VALUE "性別"
FROM
  PERSONAL P,
  (SELECT
    CODE,
    VALUE
  FROM
    MASTER_TABLE
  WHERE
    KEY = '101') M
WHERE
  M.CODE = P.SEIBETU

さぷり
会議室デビュー日: 2005/11/18
投稿数: 18
投稿日時: 2005-12-01 11:38
こんにちわ。
試してはいませんが、こんなのはどうですか?

SELECT PERSONAL.NAME "氏名", MASTER.VALUE "性別"
FROM PERSONAL LEFT OUTER JOIN MASTER
ON (PERSONAL.CODE=MASTER.CODE AND MASTER.KEY='101');


[ メッセージ編集済み 編集者: さぷり 編集日時 2005-12-01 11:49 ]
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-12-01 13:12
お世話になります。

分かり難い日本語かな、と思ったのですが、
短時間にレスを頂けるとは思っていませんでしたので
非常に嬉しく思います。
ありがとうございます。

結果的に夏椰【SUICA】さんの案で行きたいと思います。
残りお二方の方法ですと、例えば
「同じ Select 文で都道府県も Decode したい」という
仕様が発生した場合、お二方の方法だと
From 以降の文が長くなってしまうかなぁ、と思いましたので。
( そんな事は無い? )

実際の業務で使用する際は数十個の項目に関して Decode を行うので、
取得対象テーブルを追加すると SQL 文が大変かなぁ、と思い。

結構悩んだ問題ですが、お知恵を拝借出来て問題解決出来ました。
今後も宜しくお願いいたします。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-12-01 13:38
引用:

小僧さんの書き込み (2005-12-01 13:12) より:

From 以降の文が長くなってしまうかなぁ、と思いましたので。
( そんな事は無い? )



処理の見通し全体を考えると、さぷりさんが書かれた join による方法にも慣れておいた方が良いですよ。

確かに長くはなりますね。
先々月だったかと思いますが、一つのテーブルが foreign key で子供テーブルを持つという階層が 3 層、各テーブルがコードを持ち、それをマスタテーブル参照により名称に置換して取得するという処理を単独の SQL 文として書く必要に迫られました。

WITH 句を用いたためとは言え、500 行を越える単一クエリは、自分で書いておいてナンですが「圧巻」の一言に尽きました。
(サブクエリによる方法だと、もっと複雑になったと思います。)

# でももっと上の規模のクエリをすらすら書く人もいるんだろうな... ←遠い目
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2005-12-01 15:04
> 処理の見通し全体を考えると、さぷりさんが書かれた
> join による方法にも慣れておいた方が良いですよ。
そうですね。
色々な書き方を覚えていた方が将来助かりますよね。
DB はちょっぴり苦手なのですが、これを機会に勉強したいと思います。

> 「圧巻」の一言に尽きました。
確かにそれくらいのスケールだと感動してしまいますねぇ。
私もそーいうのを書く日が来るのでしょうか???

色々とありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)