- ベストアンサー
こういうSELECTは可能でしょうか?
テーブルA ---------- コード 区分 金額1 金額2 というテーブルがあるとして、その中から、 区分=1 AND 金額1>=0 の時は金額1、 区分=1 AND 金額1< 0 の時は金額2、 区分=2 AND 金額2>=0 の時は金額2、 区分=2 AND 金額2< 0 の時は金額1 をSELECTしたいのですが、1つのSELECT文で抽出する事は可能でしょうか? SELECT ・・・ ←ここにどう書けば良いんでしょうか? FROM テーブルA;
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
手元にOracleが無いので確認できませんが、DECODE関数か、CASE式を使えば良いように思えます。
その他の回答 (6)
- corgi12kg
- ベストアンサー率51% (28/54)
またウソつきました 条件が金額1>=0なので・・・ select * from( (select コード,decode(SIGN(金額1),-1,金額2,金額1) as W_金額 from テーブルA where 区分 = 1) union all (select コード,decode(SIGN(金額2),-1,金額1,金額2) as W_金額 from テーブルA where 区分 = 2) ) order by コード; ですね
- corgi12kg
- ベストアンサー率51% (28/54)
SQL> insert into テーブルA values('A001',1,1,100); 1行が作成されました。 SQL> insert into テーブルA values('A002',1,-100,2); 1行が作成されました。 SQL> insert into テーブルA values('A003',2,100,3); 1行が作成されました。 SQL> insert into テーブルA values('A004',2,4,-100); 1行が作成されました。 SQL> commit ; コミットが完了しました。 SQL> select * from( 2 (select コード,decode(SIGN(金額1),1,金額1,金額2) as W_金額 3 from テーブルA 4 where 区分 = 1) 5 union all 6 (select コード,decode(SIGN(金額2),1,金額2,金額1) as W_金額 7 from テーブルA 8 where 区分 = 2) 9 ) 10 order by コード; コード W_金額 -------- ---------- A001 1 A002 2 A003 3 A004 4 SIGN 構文 SIGN(n) 用途 n<0ならば-1、n=0ならば0、n>0ならば1を戻します。 前回は「ウソ」ついてごめんなさい 今度こそ「自身あり」です
- peugeot307
- ベストアンサー率22% (29/130)
DECODEを使うなら、引数1に演算式を入れて下さい。 それかCASE式と使われてはいかがでしょう?
- corgi12kg
- ベストアンサー率51% (28/54)
[補足] select * from( (select コード,decode(金額1,金額1>=0,金額1,金額2) as W_金額 from テーブルA where 区分 = 1) union all (select コード,decode(金額2,金額2>=0,金額2,金額1) as W_金額 from テーブルA where 区分 = 2) ) order by コード
- corgi12kg
- ベストアンサー率51% (28/54)
select * from( (select コード,decode(金額1,金額1>=0,金額1,金額2) as W_金額 from テーブルA where 区分 = 1) union all (select コード,decode(金額2,金額2>=0,金額2,金額1) as W_金額 from テーブルA where 区分 = 2) )
- rotesKomet
- ベストアンサー率31% (83/265)
ORACLEはあまり詳しくありませんが、UNIONを使用すれば出来るかも... SELECT 金額1 FROM テーブルA WHERE (区分=1 AND 金額1>=0) OR (区分=2 AND 金額2< 0) UNION SELECT 金額2 FROM テーブルA WHERE (区分=1 AND 金額1< 0) OR (区分=2 AND 金額2>=0)
補足
ありがとうございます。 私も最初、decode関数を使おうと思ったのですが、 decode(金額1,金額1>=0,金額1,金額2) のような書き方が出来ませんでした。 =<>などはdecode関数内で使えないものと思ったのですが、どうなのでしょうか?