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