7.32.1 フィールド参照の指定形式および規則
フィールド参照は,構造データ中のフィールドの値を参照する際に使用します。参照するフィールドをフィールド名で指定します。
- 〈この項の構成〉
(1) 指定形式
フィールド参照::=構造値式.フィールド名 構造値式::=値式
(2) 指定形式の説明
- 構造値式:
-
構造値式には,構造データ(STRUCT型)の列名を指定します。値式については,「7.21 値式」を参照してください。
指定規則を次に示します。
-
構造値式には,構造データを指定してください。
-
構造値式には,?パラメタを指定できません。
-
- フィールド名:
-
参照するフィールドの名称を指定します。
構造データ中に存在しないフィールド名は指定できません。
フィールド参照の指定例を次に示します。
"DEPARTMENT"."DEPT_NAME"
DEPARTMENTはSTRUCT型の列で,DEPT_NAMEはDEPARTMENT列中のフィールド名です。
(3) 規則
-
構造値式がナル値の場合,フィールド参照の結果はナル値になります。
-
指定したフィールド名に対応するデータ型が,フィールド参照の結果のデータ型になります。
-
フィールド参照の指定形式と列指定の指定形式は,例えば「A.B」という形式で,どちらも識別子をピリオド(.)で連結して指定します。HADBは,次の表に示す規則に従って,指定内容がフィールド参照か,または列指定かを判定します。
なお,表中のA,B,C,Dは識別子の指定を意味しています。また,1.,2.,3.の数字は,HADBが判定する際の優先度を意味しています(1.が最も優先度が高い)。
表7‒52 フィールド参照と列指定の判定方法 指定形式
HADBが仮定する指定
フィールド参照か列指定かの判定
A
列名
列指定
A.B
1.相関名.列名
1.表識別子.列名
1.問合せ名.列名
列指定
2.列名.フィールド名
フィールド参照
A.B.C
1.スキーマ名.表識別子.列名
列指定
2.相関名.列名.フィールド名
2.表識別子.列名.フィールド名
2.問合せ名.列名.フィールド名
フィールド参照
3.列名.フィールド名.フィールド名
A.B.C.D
1.スキーマ名.表識別子.列名.フィールド名
フィールド参照
2.相関名.列名.フィールド名.フィールド名
2.表識別子.列名.フィールド名.フィールド名
2.問合せ名.列名.フィールド名.フィールド名
3.列名.フィールド名.フィールド名.フィールド名
[説明]
-
HADBによる識別子の解釈については,1.が最も優先度が高いことを示しています。
(例)
CREATE FOREIGN TABLE "T1" ("T1" STRUCT {"T1" INTEGER})… SELECT COUNT(*) FROM (SELECT "T1"."T1" FROM "T1")下線部分の選択式に指定した"T1"."T1"は,「表識別子.列名」または「列名.フィールド名」のどちらかである可能性があります。この場合,上記の表に示す規則の優先度に従って,「表識別子.列名」の「列指定」として判定されます。
-
上記の表では,「A.B.C.D」の指定までを説明していますが,「A.B.C.D.E」以降も「A.B.C.D」と同じ扱いになります。
-
(4) 例題
次に示す社員表(EMPLIST)を検索対象とするSQL文の実行例を説明します。
-
DEPARTMENT列をSTRUCT型として定義しています。
-
DEPARTMENT列のMANAGERフィールドをSTRUCT型として定義しています。
CREATE FOREIGN TABLE "EMPLIST"("USER_ID" INTEGER,
"USER_NAME" VARCHAR(100),
"ADDRESS" VARCHAR(100),
"DEPARTMENT" STRUCT {"DEPT_NAME" VARCHAR(100),
"LOCATION" VARCHAR(100),
"MANAGER" STRUCT {
"MANAGER_ID" INTEGER,
"MANAGER_NAME" VARCHAR(100)
}
}
)…
- 例題1
-
社員表(EMPLIST)から,社員名(USER_NAME)と所属部署名(DEPT_NAME)を検索します。
SELECT "USER_NAME","DEPARTMENT"."DEPT_NAME" FROM "EMPLIST"
下線部分がフィールド参照の指定です。
- 例題2
-
社員表(EMPLIST)から,社員名(USER_NAME)とマネージャ名(MANAGER_NAME)を検索します。
SELECT "USER_NAME","DEPARTMENT"."MANAGER"."MANAGER_NAME" FROM "EMPLIST"
下線部分がフィールド参照の指定です。
- 例題3
-
部署表(DEPTLIST)に対して,社員名(USER_NAME)と所属部署名(DEPT_NAME)のデータを追加します。
INSERT INTO "DEPTLIST" ("USER_NAME","DEPT_NAME") SELECT "USER_NAME","DEPARTMENT"."DEPT_NAME" FROM "EMPLIST"下線部分がフィールド参照の指定です。
- 例題4
-
社員表(EMPLIST)のデータを使用して,メンバー表(MEMBERLIST)のエンジニアフラグ(E_FLG)を更新します。
UPDATE "MEMBERLIST" SET "E_FLG" = 'Y' WHERE EXISTS (SELECT * FROM "EMPLIST" WHERE "EMPLIST"."DEPARTMENT"."DEPT_NAME" IN ('ENGINEERING','TECHNICAL') AND "EMPLIST"."USER_ID" = "MEMBERLIST"."USER_ID" )下線部分がフィールド参照の指定です。