预计CHAR得到NUMBER

时间:2013-08-07 14:08:55

标签: oracle oracle11g

DB:Oracle 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

我收到错误'预计CHAR有NUMBER',这里有EXTS,GROUP_ID& GRP_ID是数字。那么有机会期待CHAR?

3 个答案:

答案 0 :(得分:1)

通常,当Oracle将不同的数据类型(例如NUMBER)与CHARACTER进行比较时,隐式转换会启动,并且一切都很顺利(前提是数据可以转换。)例如,如果您有一个需要CHARACTER值但是通过的函数它是一个NUMBER,一切都很好 - Oracle只是将NUMBER转换为字符。

E.g。像这样的函数:

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”,那么我觉得有些东西已经关闭了。

答案 1 :(得分:0)

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

答案 2 :(得分: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