- PR -

ORACLEのDECODE関数について教えて下さい

1
投稿者投稿内容
いち
会議室デビュー日: 2003/06/09
投稿数: 12
投稿日時: 2005-04-22 20:01
ORACLEの初心者です。
今回、データベースとしてORACLE9iを使用しております。
そこで、テーブルの項目として以下の項目がある場合
・発注数1
・発注数2
・納入数1
・納入数2
下記の判断を行いたいのですが、DECODE関数でできるのでしょうか?
発注数1<=納入数1 AND 発注数2<=納入数2の時、文字列の「完了」
発注数1>納入数1 OR 発注数2>納入数2の時、文字列の「残」
をSELECTする。
ORACLEの熟練者の方、ご教示いただけますようお願いします

[ メッセージ編集済み 編集者: いち 編集日時 2005-04-22 20:02 ]
おいちゃん
会議室デビュー日: 2005/04/22
投稿数: 1
投稿日時: 2005-04-22 21:30
 このような場合、SIGN 関数を使用します。
 SIGN 関数は、次のような値を返します。

・正の引数:1
・0 の引数:0
・負の引数:1

 従って、下記のように書けばご希望の結果が得られると思います。

DECODE( SIGN("発注数1"-"納入数1"),
1, '残',
DECODE( SIGN("発注数2"-"納入数2"),
1, '残',
'完了'
)
)

 ただ、9i とのことですので、CASE を使用した方が分かりやすくて
良いのではないかと思います。
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-04-25 11:10
CASE
WHEN 発注数1<=納入数1 AND 発注数2<=納入数2 THEN '完了'
ELSE '残'
END

で問題ないと思いますが。最近のOracleはSQL標準をどんどんと取り入れていますので、
古いDECODEやNVL等はなるべく使わないようにするのがベターだと思いますよ。
いち
会議室デビュー日: 2003/06/09
投稿数: 12
投稿日時: 2005-04-25 12:36
CASE文を使用することで、if elseif elseの判断が簡単にでき
ることを理解しました。

おいちゃん様、あんとれ様、ご教示ありがとうございました。


[ メッセージ編集済み 編集者: いち 編集日時 2005-04-25 12:36 ]
No鶴瓶 NoLife
常連さん
会議室デビュー日: 2005/01/28
投稿数: 48
投稿日時: 2005-04-25 13:05
そのプロジェクトからの脱出をおすすめします。

そんな正規化もされていない、発注と納入のエンティティ
がごっちゃになっているデータモデルを見るだけで
危うさをビンビン感じちゃいます。
1

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