2016-11-25 7 views
2

У меня есть строка, имеющая только цифры и пробел.
Я использую функцию CASE и NVL для получения вывода.
Если строка NULL, то используйте одно и то же строковое значение else use 1.
Я могу различать поведение для SQL и PLSQL.
Может ли кто-нибудь дать какое-либо объяснение этому поведению, и какой из них лучше всего подходит.Оператор CASE и NVL предоставляют разные выходные данные в Oracle11G

в SQL

функция NVL работает и обеспечивает результат без TRIM

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

LV  
------- 
" 1234" 

ДЕЛУ дает 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" 

Case Заявление обрезает результат

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

'С Т AS (SELECT '1234' LV FROM DUAL) ВЫБОР СЛУЧАЙ, КОГДА LV IS NOT NULL THEN LV ELSE '1' END FROM T; ' – MT0

+0

@ MT0, конечно, это вернет то, что мы ожидаем, но это не объясняет, почему Oracle делает актерский номер в' case' и не в 'nvl' – Kacper

+2

Объяснение в том, что это что делает Oracle. Прочитайте документацию Oracle по функциям NVL и выражения CASE. В документации четко объясняется, как каждый ведет себя, когда задействованы типы данных. –

ответ

1

проблема в вашем случае заявление.

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END

Здесь LV имеет тип VARCHAR и другое заявление, Вы назначаете 1 как целое значение, создавшей проблемы для разных типов данных.

Просто обновите ваш случай заявление, как указано ниже, и она будет работать в оракула

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