• ベストアンサー

SQLPLUSにて演算子を使う方法と条件文を使いたい・・

以下のようにspoolコマンドにてselectの結果をCSVに出力したいのですが、カンマ区切りしたいため連結していますがエラーが発生します。 spool aaa.csv select AAA || ',' || BBB || ',' ||   CCC - DDD || ',' || EEE from table_A ・・・ そうすると、引き算が引っかかっているらしく、 「ORA-01722:数値が無効です」エラーが発生します。 連結をやめて、「|| ',' ||」→「,」にすれば正常に終了します。 連結の場合に演算子を使うにはどのようにすればよいのでしょうか? また、例えば「AAA<0」の場合には、BBBに100を掛けるとかのような 他カラムでの条件により、別カラムの計算結果を変えるといったことは 可能なのでしょうか? よろしくお願い致します。

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

CCC列とDDD列のデータ型は何ですか? もしかしてcharやvarchar2等の文字列では? desc table_Aの結果を教えてください。 この情報からだと暗黙の型変換で変換できない値が 入っていてエラーになっているように見えます。 ※計算で「ORA-01722」が出るとはこのパターンが多い。 例) create table test_table ( ccc number(10), ddd varchar2(10)); insert into test_table values(10,'1'); insert into test_table values(11,'A'); ・numberに変換可能 select ccc - ddd from test_table where ddd='1'; CCC-DDD ---------- 9 ・numberに変換不能 select ccc - ddd from test_table where ddd='A'; 行1でエラーが発生しました。: ORA-01722: 数値が無効です。

ryozyryozy
質問者

補足

ありがとうございます。 ただ型はNumber型でした。 すいませんが宜しくお願い致します。

その他の回答 (3)

  • ishi7474
  • ベストアンサー率32% (71/216)
回答No.4

SQL*Plusをお使いとのことですので、データ型を揃えるのが面倒でしたら SET COLSEP ','を試してみて下さい。SQL文では策を弄することなく SELECT AAA, BBB, CCC - DDD, EEE FROM table_A... で希望される出力が得られるように思います。

回答No.3

Oracle内で条件分岐をしたい時には、「CASE述語」や「DECODE関数」といった一般関数がありますね。 ORACLE MASTER Bronze SQL基礎I 講座(4) SQLの関数を使いこなす ■理解しておきたいこと 3.一般関数 http://jibun.atmarkit.co.jp/lskill01/rensai/bronzesql04/bronzesql01.html

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

カッコで括って、演算順序を明確にしてあげてください。 SELECT AAA || ',' || (CASE WHEN AAA<0 THEN BBB*100 ELSE BBB END) || ',' ||   (CCC - DDD) || ',' || EEE FROM table_A

ryozyryozy
質問者

補足

ご回答ありがとうございます。 ただ、括弧でくくるのは試してみましたが、結果は同じでした。 なお、実際は複数のテーブルを結合してますが関係ありますでしょうか? select A.AAA || ',' || B.BBB || ',' || (C.CCC - D.DDD) from table_A A innner join table_B B on ・・・ どうぞよろしくお願い致します。

関連するQ&A