SQL Nullが可能なフィールドの割り当て、条件、式
このセクションでは、以下におけるSQL Nullフィールドの動作について説明します。
· 割り当て
· 条件
· 式
ここでの説明では、以下のフィールド定義を使用します。
Define Field(#A) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL)
Define Field(#B) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL)
Define Field(#C) Type(*DEC) Length(9) Decimals(0) Default(*NULL)
さらに、次のトピックも参照してください。
「ASQN(Allow SQL Nulls: SQL Nullを許可)属性」
「条件および式の指定」 (どちらも 『LANSAテクニカルリファレンスガイド』に収録)
SQL Nullフィールドが割り当てのためのANSI規則により確実に処理されるようにする場合は、*STRICT_NULL_ASSIGN関数オプションを使用可能にします。このオプションでは、ソース・フィールドがSQL Nullで、ターゲット・フィールドにASQN属性が設定されていない場合は、実行時に致命的なエラーが発生します。
SQL Nullを許可するフィールドでは、次の例のようにSQL Nullを明示的に設定することもできます。
#B := *SQLNULL
現在SQL Nullであるフィールドを別のフィールドに割り当てることができます。ターゲット・フィールドがSQL Nullを許可されると、SQL Nullに設定されます。次の例では、#BがSQL Nullなので#AはSQL Nullになります。
#A := #B
ターゲット・フィールドにASQN属性が設定されていない場合は、*STRICT_NULL_ASSIGN関数オプションが使用可能にされるかどうかによって動作が異なります。デフォルトでは、フィールド・タイプの*NULL値はターゲット・フィールドに割り当てられます。次の例では、#Cが数値フィールドなのでゼロに設定されます。フィールド・タイプごとの*NULL valueの定義については、「CHANGEのパラメータ」を参照してください。
#C := #B
ただし、*STRICT_NULL_ASSIGNが有効にされ、#BがSQL Nullである場合に上のサンプル・コードが実行されると、ターゲット・フィールドがSQL Nullの設定をサポートしないため致命的なエラーが発生します。LANSA開発者は、*STRICT_NULL_ASSIGNを使用する場合は、この種の実行時エラーを出さないように注意深くコーディングする必要があります。例えば、以下のようになります。
If (*Not #B.IsSqlNull)
#C := #B
Else
Message Msgtxt('#B is SQL Null')
Endif
また.AsValue組み込みメソッドを使用して、SQL Nullフィールドを別の値として扱うことができます。これはSQL Nullまたは*NULLが適切な値ではない場合の数値演算と連結に便利です。次の例では、#BがSQL Nullの場合に#Cに5という結果を取得できます。ただし#Bが3である場合は、#BがSQL Nullである場合にのみ#B. AsValueが#Bに影響を与えるため、#Cは15に設定されます。
#C := #B.AsValue( 1 ) * 5
さらに、次のトピックも参照してください。
· SQL Nullかどうかを検査するには、*IS *SQLNULLまたは*ISNOT *SQLNULL、あるいは組み込みプロパティ.IsSqlNullを使用してください。
· IF_NULLまたは.IsNullを使用すると、SQL NullフィールドはFALSEを返します。
· SQL Nullは値を表さないため、フィールドを比較するために*EQ、*LE、*GTなどの比較演算子を使用し、比較のいずれかの要素がSQL Nullの場合は、比較によってSQL Nullが生成されます。また、*ORまたは*AND演算子と組み合わせると、SQL Null要素により引き続きSQL Nullが生成されます。SQL Nullを生成する条件式の評価結果はfalseになります。
· SQLNULL値がtrueの場合、SQLNULLの比較は常にSQLNULLのままになります。すなわち、式によってSQLNULLを検査する場合にSQLNULLが存在すると、式ではSQLNULL値が維持されます。このような場合は、*ORIFブール機能を使用してください。
IF COND((#DATE2.IsSqlNull) *orif (#DATE1 *gt #DATE2))
#DATE2 := #DATE1
ENDIF
· 条件によってNullおよびSQL Nullの両方に対してTRUEが返されるようにするには、*ORIFブール機能と、組み込みプロパティ.IsSqlNullおよび組み込みプロパティ.IsNullを組み合わせて使用します。サンプル・フィールド#Aについての次の条件は、フィールドがゼロまたはSQL Nullの場合にTRUEを返します。
(#A.IsSqlNull) *orif (#A.IsNull)
· 条件にSQL Nullと他の特定の値の両方にTRUEを返させる場合は「組み込みメソッド.AsValue」を使用します。次の条件は、フィールドが1またはSQL Nullの場合にTRUEを返します。
#A.AsValue(1) *EQ 1
以下の表に、サンプル・フィールド#Aおよび#BがどちらもSQL Nullで#Cが*ZEROの場合のさまざまな条件の結果をまとめます。
条件 |
結果 |
#A.IsSqlNull |
TRUE |
#A.IsNull |
FALSE |
(#A.IsSqlNull) *orif (#A.IsNull) |
TRUE |
IF_NULL(#A #B #C) |
FALSE |
IF_NULL(#C) |
TRUE |
#A.AsValue(*ZERO) *EQ *ZERO |
TRUE |
#A *EQ *ZERO |
FALSE |
#A *EQ *ZERO |
FALSE |
#A *EQ *ZERO |
FALSE |
#B *EQ #C |
FALSE |
#B *EQ #C |
FALSE |
式の評価中は、中間結果はSQL Null状態を保持します。その結果は常に厳密に解釈されます。例えば、#BがSQL Nullの場合は、式'#B + 1'の結果はSQL Nullです。SQL Nullに1を足しても、SQL Nullのままだからです。これは結果フィールドの属性とは無関係です。
動作の違いが発生するとすれば、それは式の結果が結果フィールドに割り当てられる場合に限られます。式の結果がSQL Nullの場合は、動作は結果フィールドがSQL Nullを許可するかどうかと、関数オプション*STRICT_NULL_ASSIGNが有効かどうかによって決まります。詳細については、「割り当て」を参照してください。
SQL Nullフィールドの値をより適切な別の値に変更する場合は「組み込みメソッド.AsValue」を使用します。例えば、#BがSQL Nullである場合は、式'#B. AsValue(1) + 1'の結果は2(および#Bが4である場合は5)です。