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を許可) 属性

条件および式の指定

割り当て

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

次のトピックも参照してください。

*SQLNULLキーワード

組み込みプロパティ.IsSqlNull

組み込みメソッド.AsValue

条件

  • 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 #B

FALSE

#A *LE #B

FALSE

#B *EQ #C

FALSE

#B *LE #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)です。
 
 SQL Null処理

  • No labels