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?
答案 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