0

数据库:甲骨文 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

我收到错误'expected CHAR got NUMBER',这里 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 回答
0

从本质上讲,这意味着您使用的某些字段彼此不兼容。这基本上是“类型不匹配”。只需检查是否有任何类型的 CHAR 与 NUMBER 类型一起使用。然后,您可以切换一个类型,或者简单地将转换用作查询的一部分。

于 2013-08-07T14:17:11.780 回答