CASE Statement和NVL在Oracle11G中提供不同的输出

时间:2016-11-25 14:30:30

标签: oracle oracle11g case oracle11gr2 nvl

我有一个只有数字和空格的字符串。
我正在使用CASE和NVL函数来获取输出 如果string为NULL则使用相同的字符串值,否则使用1.
我能够为SQL和PLSQL提供不同的行为 任何人都可以提供有关此行为的一些解释,以及哪一种是最佳方法。

SQL

中的

NVL功能工作并提供无TRIM的结果

WITH T AS (SELECT ' 1234' LV FROM DUAL )
SELECT '"'||NVL(LV,1)||'"'  LV
FROM T;

LV    
-------
" 1234" 

CASE给出了ORA-00932错误

WITH T AS (SELECT ' 1234' LV FROM DUAL )
SELECT CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END
FROM T;


Error report:
SQL Error: ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

PLSQL

NVL提供带空格的结果

SET SERVEROUTPUT ON
DECLARE
LV VARCHAR2(10):=' 1234';
BEGIN
DBMS_OUTPUT.PUT_LINE('BEFORE CASE -"'||LV||'"');
LV:=NVL(LV,1);
DBMS_OUTPUT.PUT_LINE('AFTER CASE -"'||LV||'"');
END;

Result:
BEFORE CASE -" 1234"
AFTER CASE -" 1234"

案例陈述TRIM结果

SET SERVEROUTPUT ON
DECLARE
LV VARCHAR2(10):=' 1234';
BEGIN
DBMS_OUTPUT.PUT_LINE('BEFORE CASE -"'||LV||'"');
LV:=CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END;
DBMS_OUTPUT.PUT_LINE('AFTER CASE -"'||LV||'"');
END;

Result:
BEFORE CASE -" 1234"
AFTER CASE -"1234"

1 个答案:

答案 0 :(得分:1)

问题在于您的案例陈述。

Failed to load resource: The network connection was lost.

此处LV的类型为varchar,而在else语句中,您将1指定为整数值,这会为不同的数据类型创建问题。

如下所述更新您的案例陈述,它将在oracle中起作用

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END