DBでコードを読み替えするときはどんな構成にしますか?

支払い区分フィールドにAとあれば「振込」、Bとあれば「現金」
支払い状況フィールドにAとあれば「優良」、Bとあれば「過去滞納あり」・・・
というような設計のマスタテーブルがあり、読み替え項目は20個を超えます。

一応自分で作ったのは、「コード:名称」の2フィールドからなる読替テーブルをつくり
「001-A:振込」
「001B:現金」
「002-A:優良」
「002-B:過去滞納」
これを登録し、以下のようにSQLを作りました。2,3個ならいいのですが20項目が40項目になったりすると、ちょっときついです。
もっとよい方法があれば教えてください。

select
読替テーブル.*, yomi1.名称, yomi2.名称
From マスタテーブル
innner join 読替テーブル as yomi1 on '001-' || 支払い区分フィールド
innner join 読替テーブル as yomi2 on '002-' || 支払い状況フィールド

回答の条件
  • 1人2回まで
  • 登録:2008/06/03 00:50:33
  • 終了:2008/06/04 09:45:47

ベストアンサー

id:taknt No.2

きゃづみぃ回答回数13481ベストアンサー獲得回数11982008/06/03 08:02:50

ポイント29pt

>支払い区分フィールドにAとあれば「振込」、Bとあれば「現金」

>支払い状況フィールドにAとあれば「優良」、Bとあれば「過去滞納あり」・・・

Aなら 振込

Bなら 現金 というようなのを関数でやる場合、

オラクルなら DECODEやCASE文が使えます。

http://www.shift-the-oracle.com/sql/case-decode-difference.html

DBには、こういう関数がいろいろありますので、使用のDBで確認してみてください。

id:hakob

CASE式はいろいろ使えて便利です。

実は今回も(質問には乗せてなかったのですが)、あるオプションを付けているか居ないかについて、1なら「有」0なら「無」の判定をするために、十個くらい使ってたりします^^;

DECODE関数はORACLE固有なのですね。使ったことが無いので存在すら知りませんでした。

CASE式を用いての集計など、幅広く応用があるので面白いです。

2008/06/03 12:57:02

その他の回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/06/03 02:05:51

ポイント41pt

■案1 読替テーブルを必要分作ってしまう

支払い区分テーブル

「A:振込」

「B:現金」

支払い状況テーブル

「A:優良」

「B:過去滞納」

この方法の利点は質問文内のSQLよりは少しシンプルに書けるし

インデックスも有効に働くため高速な動作が期待できる。

ただ、項目数が多くなればなるほど面倒になるという点はあまり変わらない。


■案2 読み替えはSQLではなくプログラム側で行う

この方法の利点は、クライアント側で処理させた場合にDBサーバと回線の負担軽減に繋がる。

ただし、このままではコードと名称が変動する度に大掛かりなメンテナンスが発生したりするため

変換用データを再読み込みするような工夫が必要。


■案1と案2の折衷

性別と言えば「男」「女」といったように変動が無いものはプログラム側で変換処理を行い

変動のあるものはテーブルとして持たせておく。

これが一番現実的で多用してます。


以上、参考になればよろしいのですが・・・。

id:hakob

案2はXMLファイルなどで、読替テーブルとする方式がよさそうですね。

<支払区分 code="A" name="振込" />

<支払区分 code="B" name="現金" />

<支払状況 code="A" ・・・・

案1は、個別の読替パターンは少なく(たとえば支払い区分は現金や振込のほかに4種類ほど)なっているので微妙ですね。

ただ、変動が想定されるもの・件数が多いものならいいかも。(都道府県くらいだと微妙で悩ましい。国名や、国-地域なんていうスケールなら確定ですね。各都道府県に数件~数十件支社があるような場合とか。)

2008/06/03 12:54:21
id:taknt No.2

きゃづみぃ回答回数13481ベストアンサー獲得回数11982008/06/03 08:02:50ここでベストアンサー

ポイント29pt

>支払い区分フィールドにAとあれば「振込」、Bとあれば「現金」

>支払い状況フィールドにAとあれば「優良」、Bとあれば「過去滞納あり」・・・

Aなら 振込

Bなら 現金 というようなのを関数でやる場合、

オラクルなら DECODEやCASE文が使えます。

http://www.shift-the-oracle.com/sql/case-decode-difference.html

DBには、こういう関数がいろいろありますので、使用のDBで確認してみてください。

id:hakob

CASE式はいろいろ使えて便利です。

実は今回も(質問には乗せてなかったのですが)、あるオプションを付けているか居ないかについて、1なら「有」0なら「無」の判定をするために、十個くらい使ってたりします^^;

DECODE関数はORACLE固有なのですね。使ったことが無いので存在すら知りませんでした。

CASE式を用いての集計など、幅広く応用があるので面白いです。

2008/06/03 12:57:02

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません