• ベストアンサー

こういう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;

質問者が選んだベストアンサー

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

手元にOracleが無いので確認できませんが、DECODE関数か、CASE式を使えば良いように思えます。

参考URL:
http://www.t3.rim.or.jp/~buchi/rdb.html#decode,http://homepage1.nifty.com/kojama/works/rdbms/mssql/sql.html#term04

その他の回答 (6)

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.7

またウソつきました 条件が金額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)
回答No.6

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を戻します。 前回は「ウソ」ついてごめんなさい 今度こそ「自身あり」です

回答No.5

DECODEを使うなら、引数1に演算式を入れて下さい。 それかCASE式と使われてはいかがでしょう?

参考URL:
http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti28.asp?educat=silver2
  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.4

[補足] 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 コード

discovery
質問者

補足

ありがとうございます。 私も最初、decode関数を使おうと思ったのですが、 decode(金額1,金額1>=0,金額1,金額2) のような書き方が出来ませんでした。 =<>などはdecode関数内で使えないものと思ったのですが、どうなのでしょうか?

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.3

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) )

回答No.1

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)