• ベストアンサー

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

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))にするときちんと実行結果が出ます。 算術演算子のほうが連結演算子より優先順位が高いと習ったのですが実は逆ということでしょうか。 回答のほどよろしくお願い致します。

  • Oracle
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • NNori
  • ベストアンサー率22% (377/1669)
回答No.1

Oracleでは算術演算子も連結演算子もSQL演算子となって優先順位が等しくなってしまう(参考URLの真ん中あたり)のではないでしょうか? そう考えれば左から実行されて文字列を連結してから+をしようとしてエラーがでているように思えます。

参考URL:
http://jibun.atmarkit.co.jp/lskill01/rensai/bronzesql02/bronzesql01.html
yukikundesuyo
質問者

お礼

回答ありがとうございます。 教師の間違いには困りますね。 とりあえず分かったのでよかったです。

その他の回答 (1)

  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.2

単項演算子としての +,- と二項演算子 +,- の違いに関する思い違いではないでしょうか? ※ 単項演算子(+,-)は、最優先の演算子です。 二項演算子(+,-)と連結演算子の優先順位は同じですから、左優先になりますので質問されているSQLではエラーになります。 乗算、除算演算子は連結演算子より上位です。 例 SELECT 'AA' || -10 * -10 || 'BB' FROM DUAL = AA100BB

yukikundesuyo
質問者

お礼

回答ありがとうございます。 教師の間違いには困りますね。 とりあえず分かったのでよかったです。

関連するQ&A

  • SQL文中の論理演算式の優先順位

    来週、初級シスアドの試験を受ける者です。 「何を今さら」と思われるかもしれませんが、参考書等に載っていなかったので質問します。 SELECT * FROM 表名 WHERE ○○○ OR △△△ AND □□□ 上記のSQL文でWHERE以下の論理演算式を解いていく場合の優先順位を教えて下さい。 問題集の解法では「△△△と□□□の論理積をだした後に○○○との論理和をだす」とありました。 また、「条件式の中の論理演算式の優先順位に注意しなさい」とありました。 この、優先順位を教えて下さい。よろしくお願いします。

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

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

  • 連結演算子で結合すると値がNullだと表示出来ない

    SQLで連結演算子(||)を使って、col1とcol2を連結させたいのですが、 どちらかの列の値がNullだと結果がNullでかえってきてしまいます。 Select col1 || '/' || col2 As set_col From table_name; col1には必ず値が入っているのですが、col2には値が入るとは限りません。 表示させる解決策はあるのでしょうか?

  • エラー「無効な識別子です」

    ORA-00904: "EMPNO": 無効な識別子です と表示されます。 解決方法知っている方、教えていただければ幸いです。 SELECT EMPNO, ENAME, D.DEPTNO, DNAME FROM DEPT D WHERE EMPNO = (SELECT EMPNO FROM EMP WHERE MGR IS NULL) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • 関係演算子が無効です。

    オラクルで作成しているのですが、関係演算子が無効です。と出ます。 どこを修正すればよいでしょうか SELECT * FROM 表, ( SELECT col FROM 表 WHERE col1,col2 > ) WHERE col = MIN(col);

  • MySQLで現在の順位を取得する方法

    Oracleには、ROWNUMがあるので、 SELECT ROWNUM,id,salary FROM emp order by salary; のように価格(salary)順で順位を振れるので、 そこからSQLだけで現在の順位を取得する事は できるのですが、 MySQLでROWNUMに変わる機能や、 現在の順位を取得する方法はございますでしょうか?

  • エラー2「無効な識別子です」

    ORA-00904: "D"."DEPT": 無効な識別子です。 先ほども似たような質問をしましたが原因がよく分からないなのでご存知の方教えていただければ幸いです。 SELECT D.DEPTNO, E.ENAME, E.SAL FROM EMP E, DEPT D WHERE E.SAL >ANY (SELECT MAX(E.SAL) FROM DEPT D, EMP E GROUP BY D.DEPT) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) SQL> DESCRIBE DEPT; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13)

  • エラー「単一グループのグループ関数ではありません」

    エラーをどうやれば修正できるかわかりません。 回答のほどよろしくお願いいたします。 SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP HAVING AVG(SAL) >ANY (SELECT SAL FROM EMP WHERE HIREDATE LIKE '82%') SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • SSISの優先順位制約の設定がうまくいかない

    SSISの優先順位制約について、 http://msdn.microsoft.com/ja-jp/library/ms140153.aspx を参照しながら設定してみたのですが、どうもうまく出来ません。。 やりたい事としては、 select count(*) as cnt from TABLE 上記クエリにてテーブルデータ件数を取得し、 0件でなければ次のコンテナの処理に移す、といったものです。 手順としては、以下を試しました。 ------------------------------------- ≪SQL実行タスク コンテナの設定≫ ▼全般タブ  ▽SQLステートメント   ・SQLSourceType:直接入力   ・SQLStateMent:select count(*) as cnt from TABLE  ▽結果セット   ・ResultSet:単一行 ▼結果セットタブ  ・結果名:@cnt  ・変数名:新しい変数にて、以下の設定を実施   ・コンテナ:パッケージ全体を選択   ・名前:変数   ・名前空間:User   ・値の型:Int32 や String で実施   ・値:0(Int32の場合) や cnt(Stringの場合) ≪優先順位制約エディタの設定≫ ▼制約オプション  ・評価操作:式と制約  ・値:成功  ・式:@cnt > 0 ------------------------------------- 全く検討違いな設定をしているとは思うのですが、 設定自体は可能で、いざ実行させると以下のエラーが表示されます。 「@cnt > 0 は True または False に評価される必要があります」 優先順位制約について、文献がほとんど見つけられなかったため、 この件についてご存知の方がいらっしゃいましたら、 何卒、ご教授のほどよろしくお願い申し上げます。

  • updateについて

    下記、SQLコマンドを実行するとMERTINの歩合給がSMITHのSALに格納されません。実行後、NULLが入ってしまいます。 ちゃんとemp表のMERTINのCOMMには値が入っているのになぜ実行結果がうまくいかないのでしょうか? 回答のほどよろしくお願い致します。 update w_emp set sal = (select comm from emp where ename = 'MERTIN') where sal < 1000 SQL> select * from w_emp; DEPTNO EMPNO ENAME JOB SAL 20 7902 FORD ANALYST 3000 20 7369 SMITH CLERK 10行が選択されました。 SQL> desc w_emp; 名前 NULL? 型 DEPTNO NOT NULL NUMBER(2) EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) SAL NUMBER(7,2) SQL> desc emp; 名前 NULL? 型 EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)