2

我有一个只有数字和空格的字符串。
我正在使用 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 为结果提供空间

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"

案例陈述 TRIMs 结果

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"
4

1 回答 1

2

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

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END

这里 LV 是 varchar 类型,在 else 语句中,您将 1 分配为整数值,这为不同的数据类型带来了问题。

只需按如下所述更新您的案例陈述,它将在 oracle 中工作

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

于 2016-11-25T16:29:53.100 回答