NULL と空文字列のデータ値。
Synopsis
NULL -- null value
'' -- empty string value
値が意図的に指定されていないことを示すには、NULL キーワードを使用します。NULL は、データ値が存在しないこをと示す、SQL で優先的な方法です。
空文字列 ('') は NULL と同じでは
ありません。空文字列は、指定された文字列です。文字を含まない、可能な最短の文字列です。空文字列は、非表示文字 $CHAR(0) により内部的に表示されます。NULL と空文字列は、多くのインスタンスでこれらを使用した結果が同じであっても、本質的に異なります。空文字列は、SQL コーディングでは回避すべきです。しかし、多くの SQL 処理では末尾の空白スペースが削除されるため、空白文字 (スペースおよびタブ) のみを含むデータ値が空文字列として処理される場合があります。
また、SQL 空文字列はすべての SQL 文字列と同様に、二重引用符 ("") で表現できますが、SQL
区切り文字付きの識別子と競合する可能性があるため、この使用方法は回避すべきです。
以下の例に示すように、
ASCII 関数を使用して、空文字列を NULL に変換できます。
SELECT DISTINCT NULL AS NullVal,
{fn ASCII('')} AS EmpStrVal
FROM Sample.Person
NOT NULL データ制約は、1 つのフィールドが 1 つのデータ値を取得することを必要とします。値ではなく NULL を指定することは許可されません。この制約は、空文字列値の使用を妨げません。詳細は、"
CREATE TABLE" コマンドを参照してください。
IFNULL 関数は NULL 値を選択します。空文字列値を選択しません。
COALESCE 関数は、指定されたデータから最初の NULL でない値を選択します。空文字列は、NULL でない値として処理されます。
CONCAT 関数または連結演算子 (||) が 1 つの文字列と 1 つの NULL を連結すると、結果は NULL になります。詳細は、以下の例を参照してください。
SELECT DISTINCT {fn CONCAT('fred',NULL)} AS FuncCat,
'fred'||NULL AS OpCat
FROM Sample.Person
AVG、
COUNT、
MAX、
MIN、および
SUM 集約関数は、それらの処理を実行するときに NULL 値を無視します (すべてのフィールドに対して NULL 値 を持つレコードが存在しないため、COUNT * はすべての行をカウントします)。
SELECT 文の
DISTINCT キーワードは、その処理に NULL を含みます。指定したフィールドに NULL 値が存在する場合、DISTINCT は NULL 行を返します。
AVG、
COUNT、および
MIN 集約関数は、空文字列値の影響を受けます。
MIN 関数は、ゼロ値を持つ行がある場合でも、空文字列を最小値と判断します。
MAX および
SUM 集約関数は、空文字列値の影響を受けません。
NULL をオペランドとして持つ任意の SQL 算術演算は、NULL 値を返します。したがって、7+NULL=NULL となります。これには、二項演算子の加算 (+)、減算 (-)、乗算 (*)、除算 (/)、整数除算 (\)、モジュロ (#)、および単項演算子符号のプラス (+) およびマイナス (-) が含まれます。
算術演算で指定された空文字列は、0 (ゼロ) 値として処理されます。
SQL 内では、NULL の長さは未定義です (<null> を返します)。しかし、空文字列の長さは、以下の例に示すように、長さゼロとして定義されています。
SELECT DISTINCT CHAR_LENGTH(NULL) AS NullLen,
CHAR_LENGTH('') AS EmpStrLen
FROM Sample.Person
ただし、標準 SQL に対する特定の Caché の拡張は、NULL と空文字列のそれぞれの長さを処理します。
$LENGTH 関数は、NULL に対して長さ 0 を、空文字列値に対して長さ 1 を返します。この機能は、Caché ObjectScript と互換性があります。
SELECT DISTINCT $LENGTH(NULL) AS NullLen,
$LENGTH('') AS EmpStrLen
FROM Sample.Person
これらの値の内部表現が有効な別の場所は、
%STRING、
%SQLSTRING、および
%SQLUPPER 関数内です。これらの関数は、空白スペースに値を追加します。NULL は実際には値を持たないため、それに空白を追加すると、文字列長 1 を生成します。しかし、空文字列は文字値を持つため、それに空白を追加すると、文字列長 2 を生成します。詳細は、以下の例を参照してください。
SELECT DISTINCT CHAR_LENGTH(%STRING(NULL)) AS NullLen,
CHAR_LENGTH(%STRING('')) AS EmpStrLen
FROM Sample.Person
埋め込み SQL から NULL または空文字列値を渡すと、NULL は文字列長 0 に変換され、空文字列は文字列長 1 に変換されます。詳細は、以下の例を参照してください。
&sql(SELECT DISTINCT null,
''
INTO :a,:b
FROM Sample.Person)
WRITE !,"The length of NULL is: ",$LENGTH(a)
WRITE !,"The length of empty string is: ",$LENGTH(b)
Caché ObjectScript では、値の存在の有無は、通常、空文字列 ("") で示されます。この値が埋め込み SQL に渡される場合は、以下の例に示すように、NULL 値として処理されます。
SET x=""
&sql(SELECT DISTINCT %SQLUPPER(NULL),
%SQLUPPER(:x)
INTO :a,:b
FROM Sample.Person)
WRITE !,"NULL length: ",$LENGTH(a)
WRITE !,"ObjectScript empty string length: ",$LENGTH(b)
ここでは、
%SQLUPPER が空白スペースを各 NULL 値に追加し、結果の長さは、どちらの場合も 1 になります。
定義されていない入力ホスト変数を指定した場合、埋め込み SQL はその値を NULL として処理します。
以下の例では、空白を追加された SQL 空文字列は、文字列長 2 として渡されます。
&sql(SELECT DISTINCT %SQLUPPER('')
INTO :y
FROM Sample.Person)
WRITE !,"SQL empty string length: ",$LENGTH(y)