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

CASE Statement and NVL provides different output in Oracle11G

我有一个只有数字和 space 的字符串。
我正在使用 CASE 和 NVL 函数来获取输出。
如果字符串为 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 提供 space

结果
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"

问题出在你的案例陈述中。

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END

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

只需按如下所述更新您的 case 语句,它将在 oracle 中运行

CASE WHEN LV IS NOT NULL THEN LV ELSE '1' END