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"

Case ステートメント結果を 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"
4

1 に答える 1

2

問題はあなたのケースステートメントにあります。

CASE WHEN LV IS NOT NULL THEN LV ELSE 1 END

ここで、LV は varchar 型であり、else ステートメントでは、1 を整数値として割り当てているため、さまざまなデータ型で問題が発生しました。

以下で説明するようにケースステートメントを更新するだけで、オラクルで機能します

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

于 2016-11-25T16:29:53.100 に答える