• ベストアンサー

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

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

  • Oracle
  • 回答数4
  • ありがとう数92

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

  • ベストアンサー
  • 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

  • SQL文の書き方

    SQL文の書き方を教えて下さい。 以下の2つのクエリー(1のクエリー&2のクエリー)を1つのクエリーで1度に抽出をかけたいのですがSQL文の書き方がわかりません。 データの発生条件としては TableBのField1は必ずTableAのField1に存在するという条件です。 TableAのField1が「AAA」から「EEE」まである場合は、TableBのField1も必ず「AAA」から「EEE」の範囲内で発生します。 よろしくお願い致します。 1のクエリー ---------------------------------------------------------------- TableA Field1 ---------------------------------------------------------------- AAA AAA AAA BBB BBB CCC DDD DDD EEE EEE EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableA.Field1) as RecCount, TableA.Field1 From TableA 結果 RecCount  Field1 3      AAA 2      BBB 1      CCC 2      DDD 3      EEE ---------------------------------------------------------------- 2のクエリー ---------------------------------------------------------------- TableB Field1 ---------------------------------------------------------------- BBB CCC CCC EEE ---------------------------------------------------------------- Field1をサマライズしてカウントと名称を取得するクエリー Select Count(TableB.Field1) as RecCount, TableB.Field1 From TableB 結果 RecCount  Field1 1      BBB 2      CCC 1      EEE ---------------------------------------------------------------- 希望する結果 TableAのRecCount TableBのRecCount TableAのField1 3                   AAA 2         1         BBB 1         2         CCC 2                   DDD 3         1         EEE

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • SQL文を教えてください。

    すみません、SQLを教えてください。 ID, 名前の2つのフィールドを持つテーブルがあります。 中身は以下のように入っています。 1, AAA 2. AAA 2, BBB 3, CCC 3, AAA 4, DDD 5, EEE, 5, DDD これを、名前のダブリをスキップしながら、 IDの大きな順番に名前を取り出したいのです。 結果は、以下のようになればいいです。 DDD EEE AAA CCC BBB どのようなSQLを組んだら実現できますか? よろしくお願いいたします。

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • 算術演算子と連結演算子の優先順位について

    select 'aa' ||nvl2(comm,1,0) + nvl2(comm,1,0) || 'aaaa' from emp →ORA-01722: 数値が無効です。 というエラーが発生します。 nvl2(comm,1,0) + nvl2(comm,1,0)部分に括弧でおおうと、 つまり(nvl2(comm,1,0) + nvl2(comm,1,0))にするときちんと実行結果が出ます。 算術演算子のほうが連結演算子より優先順位が高いと習ったのですが実は逆ということでしょうか。 回答のほどよろしくお願い致します。

  • SQLについて

    aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 111 111 111 111 111 111 111 112 112 112 112 112 112 111 112 113 113 113 113 113 111 114 114 114 114 114 114 111 114 114 114 114 114 114 112 114 115 115 114 114 115 111 114 115 115 114 114 115 112 116 116 116 116 116 116 111 116 116 116 116 116 116 112 116 116 116 116 116 117 111 116 116 116 116 116 117 112 118 118 118 118 118 118 118 上記のようなデータより、SQLのSELECTを使用して、以下のように抽出したいです。 抽出条件は以下が全て満たしているものとなります。 ・aaa,ccc,ddd,eee,gggが重複、hhhが小さいもの ・bbbが異なるもの aaa bbb ccc ddd eee ggg hhh ---------------------------------------------- 112 112 112 112 112 112 111 ・・・(1) 112 113 113 113 113 113 111 ・・・(1) 114 114 114 114 114 114 111 ・・・(2) 114 115 114 114 114 115 111 ・・・(2) (1)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象 (2)はaaa,ccc,ddd,eee,gggが重複、bbbが異なるため抽出対象  また、hhhが小さいもの 以上、よろしくお願いします。

  • C言語による「テキストファイルの読み書き(fprintf)」について

    C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

  • 異なるテーブルのレコード削除

    オラクル初心者です。宜しくお願いします。 AAA、BBB、CCCというテーブルがあると仮定します。 画面から入力された値(ddd)をキーとして、CCCテーブルから該当するレコードをセレクト文で引っ張り、eeeという値を抜き出したとします。 そのeeeという値をキーにAAA、BBBテーブルのレコードを削除するにはどういうSQLを発行すればよろしいでしょうか? "delete from AAA, BBB where eee = (select eee from CCC where fff = ddd);" では駄目でした。 質問が下手でわかりにくいかもしれませんが、どうかご教授お願いします。

  • カラム名を全て出力したいのですが。

    カラム名の出力について質問です。 Oracle9iでテーブルを選択してみました。 データ内容は以下のとおりです。 <AAAテーブル> aaa : CHAR 8 bbb : CHAR 1 ccc : CHAR 10 ddd : CHAR 2 eee : CHAR 3 すると結果がこうなりました。 select * from AAA; aaa b ccc dd eee  ←すいません、下の下線に合わせて文字があります。 -------- - ---------- -- --- 11111 1 1111111111 11 111 カラム名が短縮されてしまっているのですが、 これを全て出力(例えばbbbというように出力)出来るようにするには どのようにしたら良いのでしょうか? よろしくお願いいたします。

  • シェルで特定行を処理する方法を教えてください。

    初めてご質問させていただきます 数時間考えましたが、全くできない初心者です。 awkとかも使ってみましたが・ちんぷんかんぷんです。 よろしくお願いいたします。 環境:RedHat、シェル:bash [やりたいこと] 特定の文字以外から始まる行を、 特定文字から始まる行へ連結させたい。 (例  aaaから始まっていない行(bbb、ccc、ddd)を、  aaaから始まる行へ出力させる。 ■元となるテキストファイル ============ aaa bbb ccc ddd aaa aaa aaa eee aaa ============ ■整形後のファイル ============ aaabbbcccddd aaa aaa aaaeee aaa ============