Hitachi

Hitachi Advanced Database SQLリファレンス


7.32.1 フィールド参照の指定形式および規則

フィールド参照は,構造データ中のフィールドの値を参照する際に使用します。参照するフィールドをフィールド名で指定します。

〈この項の構成〉

(1) 指定形式

フィールド参照::=構造値式.フィールド名
 
  構造値式::=値式

(2) 指定形式の説明

構造値式

構造値式には,構造データ(STRUCT型)の列名を指定します。値式については,「7.21 値式」を参照してください。

指定規則を次に示します。

  • 構造値式には,構造データを指定してください。

  • 構造値式には,?パラメタを指定できません。

フィールド名

参照するフィールドの名称を指定します。

構造データ中に存在しないフィールド名は指定できません。

フィールド参照の指定例を次に示します。

"DEPARTMENT"."DEPT_NAME"

DEPARTMENTSTRUCT型の列で,DEPT_NAMEDEPARTMENT列中のフィールド名です。

(3) 規則

  1. 構造値式がナル値の場合,フィールド参照の結果はナル値になります。

  2. 指定したフィールド名に対応するデータ型が,フィールド参照の結果のデータ型になります。

  3. フィールド参照の指定形式と列指定の指定形式は,例えば「A.B」という形式で,どちらも識別子をピリオド(.)で連結して指定します。HADBは,次の表に示す規則に従って,指定内容がフィールド参照か,または列指定かを判定します。

    なお,表中のABCDは識別子の指定を意味しています。また,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文の実行例を説明します。

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"
      )

下線部分がフィールド参照の指定です。