【PL/SQL】空文字の扱い
Oracleでは、PL/SQL・SQLの両方で、空文字(0バイト文字列)をNULLとして扱います。
SQLServer、DB2、MySQLでは空文字とNULLは別物として扱います。
PL/SQLの場合
変数「AAA」に空文字を設定した場合、変数の値は「NULL」となります。
変数値がNULLとなる為、(1)は通りません。
正しい判定(IF)としては「IS NULL」とします。(2)は通ります。
半角スペースを除外して値が設定されているか確認したい場合は、「RTRIM※」でスペースを除去するとNULLとなるので「IS NULL」で判定します。(3)は通ります。
※「RTRIM」を使用しているのは、古いOracleでは「TRIM」命令がなかった為です。動作としては「LTRIM」・「TRIM」・「RTRIM」のどれを使用しても同じです。
DECLARE
AAA VARCHAR2(10);
BEGIN
AAA := '';
IF AAA = '' THEN
NULL; --ここは通らない (1)
END IF;
IF AAA IS NULL THEN
NULL; --ここは通る (2)
END IF;
AAA := ' ';
IF RTRIM(AAA) IS NULL THEN
NULL; --ここは通る (3)
END IF;
END
SQLの場合
例えば、「TBL」テーブルの「AAA」項目に空文字が設定されているつもりの場合、
SELECT * FROM TBL WHERE (AAA = ")
は該当レコードが0件となります。
正しくは、
SELECT * FROM TBL WHERE (AAA IS NULL)
です。
設定されているつもりと書いたのは、そもそもテーブルに空文字を登録できない為です。
UPDATE TBL SET
AAA = "
とした場合、「AAA」項目の値は「NULL」となります。