0

DB: オラクル 11g

クエリ:

SELECT CASE
      WHEN rs.OPTION = '3'
      THEN
        (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0
        FROM CRSIDM.SUB_OPTS ex
        INNER JOIN CRSIDM.SUB_OPTS_GRP cg
        ON  cg.GROUP_ID   = ex.GRP_ID        
        )
      ELSE
        (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0
        FROM CRSIDM.SUB_OPTS ex
        INNER JOIN CRSIDM.SUB_OPTS_POL cg
        ON  cg.GROUP_ID   = ex.GRP_ID
        )
    END    AS PROPTS
  FROM PR_OPTS

EXTS、GROUP_ID、および GRP_ID は数値です。それでは、どのように CHAR を期待する可能性があるのでしょうか?

4

3 に答える 3

1

一般に、Oracle が NUMBER などの異なるデータ型を CHARACTER と比較する場合、暗黙的な変換が開始され、すべて問題ありません (データを変換できる場合)。たとえば、CHARACTER 値を期待する関数があり、NUMBER を渡す場合、すべて順調です-Oracleは単純にNUMBERを文字に変換します。

たとえば、次のような関数:

create or replace function get_something(p_id VARCHAR2) return number ...

これで呼び出すと動作します:

get_dno(10);

またはこれ:

get_dno('10');

そしてSQLでは:

select * from some_table where numeric_column = '10' -- no problem.

この種のエラーが表示される一般的な場所は、CASE ステートメントの戻り値です。たとえば、次のような場合にエラーが発生します。

SQL> SELECT CASE WHEN 1 = 1 THEN '1' ELSE 2 END
  2  FROM dual
  3  ;
SELECT CASE WHEN 1 = 1 THEN '1' ELSE 2 END
                                     *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected CHAR got NUMBER

(最初の WHEN 句のデータ型は、後続の他の WHEN/ELSE 句で期待されるものです。)

しかし、あなたの場合、 WHEN と THEN の両方がカウントを返します - データ型は一貫しています。それで、そこにニシンがいると思います。

Alex が前述したように、OPTION はキーワードであり、それを列名として使用してテーブルを作成しようとすると、Oracle は同意しません。

SQL> create table dummy
  2  (option varchar2(10)
  3  );
(option varchar2(10)
 *
ERROR at line 2:
ORA-00904: : invalid identifier

これは機能します:

SQL> create table dummy
  2  (option_col varchar2(10)
  3  );

Table created.

または引用符でそれを行うことができます:

SQL> create table dummy
  2  ("option" varchar2(10));

Table created.

しかし今、あなたは傷だらけの世界にいます。これからは引用符が必要です。

SQL> select option from dummy;
select option from dummy
       *
ERROR at line 1:
ORA-00936: missing expression

SQL> select d.option from dummy d;
select d.option from dummy d
         *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification

引用符付き:

SQL> select d."option" from dummy d;

no rows selected

したがって、クエリが実際に「期待されたCHAR、取得したNUMBER」を提供している場合、何かがおかしいように見えます。

于 2013-08-07T18:20:51.920 に答える
0

問題はOPTION = '3'、引用符が、単一の文字を含む文字列を探していることを示していることです3

代わりにこれを試してください:

SELECT CASE 
    WHEN rs.OPTION = 3 
    THEN 
        (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0 
        FROM CRSIDM.SUB_OPTS ex 
        INNER JOIN CRSIDM.SUB_OPTS_GRP cg 
        ON cg.GROUP_ID = ex.GRP_ID)
    ELSE
        (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0
        FROM CRSIDM.SUB_OPTS ex
        INNER JOIN CRSIDM.SUB_OPTS_POL cg
        ON cg.GROUP_ID = ex.GRP_ID)
    END AS PROPTS
FROM PR_OPTS
于 2013-08-07T14:22:23.847 に答える