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
我有一个只有数字和 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