У меня есть строка, имеющая только цифры и пробел.
Я использую функцию 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"
'С Т AS (SELECT '1234' LV FROM DUAL) ВЫБОР СЛУЧАЙ, КОГДА LV IS NOT NULL THEN LV ELSE '1' END FROM T; ' – MT0
@ MT0, конечно, это вернет то, что мы ожидаем, но это не объясняет, почему Oracle делает актерский номер в' case' и не в 'nvl' – Kacper
Объяснение в том, что это что делает Oracle. Прочитайте документацию Oracle по функциям NVL и выражения CASE. В документации четко объясняется, как каждый ведет себя, когда задействованы типы данных. –