7.31.1 配列要素参照の指定形式および規則
配列要素参照は,配列データ中の配列要素を参照する際に使用します。参照する配列要素を添え字で指定します。
- 〈この項の構成〉
(1) 指定形式
配列要素参照::=配列値式[添え字] 配列値式::=値式一次子 添え字::={符号なし整数定数|ANY〔(識別番号)〕} 識別番号::=符号なし整数定数
(2) 指定形式の説明
- 配列値式:
-
配列値式には,配列データを値式一次子の形式で指定します。値式一次子については,「7.21 値式」を参照してください。
指定規則を次に示します。
-
配列値式には,配列データを指定してください。
-
配列値式には,?パラメタを指定できません。
-
- 添え字:
-
添え字を次のどちらかの形式で指定します。
-
符号なし整数定数
-
ANY〔(識別番号)〕
- 符号なし整数定数:
-
配列値式に指定した配列データの要素番号を指定します。
(例)
"C1"[2]
下線部分が添え字で,符号なし整数定数を指定しています。この場合,C1列(配列型の列)の要素番号が2である配列要素を参照します。添え字に符号なし整数定数を指定した場合の例については,「(4) 例題」を参照してください。
指定規則を次に示します。
-
添え字には,1~30,000の符号なし整数定数を指定します。
-
添え字には,配列値式に指定した配列データの最大要素数よりも大きい値を指定できません。
-
- ANY〔(識別番号)〕:
-
ANYを指定した配列要素参照は,配列値式に指定した配列データ中の任意の配列要素を参照する場合に指定します。
指定規則を次に示します。
-
ANYを指定した配列要素参照は,WHERE句の述語中にだけ指定できます。
-
ANYを指定した配列要素参照を指定した条件式が評価対象にできる表は,1つの表だけです。
- 識別番号:
-
複数の配列要素参照を1つの組と見なして述語の評価を行いたい場合,各配列要素参照に同じ識別番号を指定します。識別番号を指定した場合の例については,「(4) 例題」を参照してください。
指定規則を次に示します。
-
識別番号には,1~255の符号なし整数定数を指定します。
-
識別番号を省略した配列要素参照に対しては,WHERE句中に指定したほかの配列要素参照の識別番号と重複しない識別番号をHADBが割り当てます。
(例)
"C1"[ANY]=1 AND "C2"[ANY]=2と指定した場合,"C1"[ANY(1)]=1 AND "C2"[ANY(2)]=2となります。
"C1"[ANY]="C2"[ANY]と指定した場合,"C1"[ANY(1)]="C2"[ANY(2)]となります。
-
-
-
(3) 規則
- ■共通規則
-
-
配列値式がナル値の場合,配列要素参照の結果はナル値になります。
-
配列値式が空の配列データの場合,配列要素参照の結果はナル値になります。
-
配列値式の結果の要素データ型が,配列要素参照の結果のデータ型になります。
-
配列要素参照は,行値構成子の行値構成子要素の値式には指定できません。
-
- ■添え字に符号なし整数定数を指定した場合の規則
-
-
配列要素参照の結果は,配列値式に指定した配列データ中の,添え字に指定した値と同じ要素番号を持つ配列要素の値になります。
-
配列値式に指定した配列データの配列要素数よりも大きい値を添え字に指定した場合,配列要素参照の結果はナル値になります。
-
- ■添え字にANYを指定した場合(ANY(識別番号)の場合も含む)の規則
-
-
ANYを指定した配列要素参照は,WHERE句に指定する述語のうち,次の個所に指定できます。
-
NULL述語の値式
-
IN述語の左側の値式
ただし,IN述語の右側に表副問合せを指定した場合,IN述語の左側の値式には,ANYを指定した配列要素参照を指定できません。
-
BETWEEN述語の左側の値式1
-
比較述語の左側または右側の値式
-
LIKE述語の一致値
-
LIKE_REGEX述語の一致値
-
-
ANYを指定した配列要素参照は,CASE式の探索条件中には指定できません。
-
ANYを指定した配列要素参照は,次の値式には指定できません。
-
CASE式のTHENに指定する値式
-
CASE式のELSEに指定する値式
-
スカラ関数DECODEの返却値または既定返却値に指定する値式
-
スカラ関数LTDECODEの返却値または既定返却値に指定する値式
-
-
識別番号が同じかどうかは,WHERE句ごとに判定されます。
(例)
SELECT "T1"."C2" FROM "T1" WHERE "T1"."C1"[ANY(1)] = 1 UNION ALL SELECT "T2"."C2" FROM "T2" WHERE "T2"."C1"[ANY(1)] = 2
上記のSELECT文には,識別番号1が2つ指定されていますが,識別番号が同じかどうかは,WHERE句ごとに判定されます。そのため,上記の場合は,識別番号が同じであるとは見なされません(SELECT文はエラーになりません)。
-
ANYを指定した配列要素参照を含む述語には,異なる表の列を指定できません。
(例)エラーになるSQL文の例
SELECT * FROM "T1","T2" WHERE "T1"."C1"[ANY(1)] = "T2"."C1"
SELECT * FROM "T1","T2" WHERE "T1"."C1"[ANY] = "T2"."C1"
上記のSELECT文は,ANYを指定した配列要素参照を下線部分の述語に指定しています。異なる表(表T1と表T2)の列を指定しているため,上記のSELECT文はエラーになります。
-
同じ識別番号を指定した配列要素参照の列指定には,異なる表の列を指定できません。
(例)エラーになるSQL文の例
SELECT * FROM "T1","T2" WHERE "T1"."C1"[ANY(1)] = 1 AND "T2"."C1"[ANY(1)] = 2
下線部分が,配列要素参照の列指定です。両方の識別番号には同じ1を指定していますが,列指定には異なる表(表T1と表T2)の列を指定しているため,上記のSELECT文はエラーになります。
-
ANYを指定した配列要素参照を含む述語には,スカラ副問合せを指定できません。
(例)エラーになるSQL文の例
SELECT "T1"."C1","T1"."C2" FROM "T1" WHERE "T1"."C1"[ANY] = (SELECT "T2"."C1" FROM "T2" WHERE "T2"."C2" = 10)
SELECT "T1"."C1","T1"."C2" FROM "T1" WHERE "T1"."C1"[ANY(1)] = (SELECT "T2"."C1" FROM "T2" WHERE "T2"."C2" = "T1"."C2")
下線部分が,ANYを指定した配列要素参照を含む述語です。この述語中にスカラ副問合せを指定しているため,上記のSELECT文はエラーになります。
なお,ANYを指定した配列要素参照を含む述語にスカラ副問合せを指定したい場合は,集まり導出表を指定したSQL文に書き換えることを検討してください。上記の例を,集まり導出表を指定したSELECT文に書き換えた例を次に示します。
(例)書き換えの例
SELECT "T1"."C1","T1"."C2" FROM "T1",UNNEST("T1"."C1") "DT" WHERE "DT"."C1" = (SELECT "T2"."C1" FROM "T2" WHERE "T2"."C2" = 10)
SELECT "T1"."C1","T1"."C2" FROM "T1",UNNEST("T1"."C1") "DT" WHERE "DT"."C1" = (SELECT "T2"."C1" FROM "T2" WHERE "T2"."C2" = "T1"."C2")
下線部分が,集まり導出表の指定です。
-
SQL文中に指定できる配列要素参照の識別番号の種類の数は,255が上限です。
なお,SQL文中にビュー表を指定している場合は,そのビュー表が導出表に等価変換されたあとに,識別番号の種類の数のチェックが行われます。
-
問合せ指定のWHERE句に指定した配列要素参照の識別番号は,それぞれ1から連番になるようにHADBが自動的に採番し直します。
-
導出問合せ中にANYを指定した配列要素参照を含む内部導出表をSQL文中に指定し,その内部導出表が展開される場合,内部導出表の導出問合せ中の配列要素参照の識別番号は,内部導出表を指定した問合せ指定に指定した配列要素参照の識別番号と重複しないようにHADBが自動的に採番し直します。
-
ANYを指定した配列要素参照を含む探索条件の結果は,次のように求められます。
- ■複数の述語に同じ識別番号の配列要素参照を指定している場合
-
同じ識別番号の配列要素参照を指定した複数の述語を含む探索条件に対して結果が求められます。探索条件の結果は次のように求められます。
-
探索条件の結果を求める際,探索条件に含まれる同じ識別番号を指定した複数の配列要素参照を,同じ添え字の配列要素ごとに1組と見なします。そして,すべての添え字(複数の配列要素参照の配列値式の中で最も多い配列要素数分)に対してそれぞれ評価が行われます。その際,添え字が配列要素参照の配列値式の配列要素数を超える場合,超えた添え字に対応する値にナル値が補完されて評価が行われます。探索条件の結果は,次の表の内容に従って決定されます。
項番
条件
探索条件の結果
1
探索条件の結果が真となる組が少なくとも1つ存在する場合
真
2
項番1の条件を満たさない場合で,かつ探索条件の結果が不定となる組が少なくとも1つ存在する場合
不定※
3
項番1と項番2の条件を満たさない場合
偽
注※ NULL述語の場合,項番2の条件は除外されます。したがって,項番1の条件を満たさない場合,探索条件の結果は偽になります。
ANYを指定した配列要素参照を含む探索条件の結果は,配列要素の組ごとに評価が行われる探索条件をOR条件でつないだ探索条件の結果と同じになります。例を次に示します。
(例)
C1列は,配列要素数が2の配列型の列とします。C2列は,配列要素数が3の配列型の列とします。
同じ識別番号の配列要素参照を指定した複数の述語を含む探索条件
左記の指定と同じ結果になる探索条件
"C1"[ANY(1)] = 1 AND "C2"[ANY(1)] = 2
("C1"[1] = 1 AND "C2"[1] = 2) OR
("C1"[2] = 1 AND "C2"[2] = 2) OR
("C1"[3] = 1 AND "C2"[3] = 2)
添え字が配列値式の配列要素数を超える"C1"[3]には,ナル値が補完されて評価が行われます。
-
- ■複数の述語に同じ識別番号の配列要素参照を指定していない場合
-
各述語に対して結果が求められます。述語の結果は次のように求められます。
-
述語の結果を求める際,述語中の1か所だけに指定した配列要素参照は,それぞれの配列要素に対して評価されます。述語の結果は,次の表の内容に従って決定されます。
項番
条件
述語の結果
1
述語の結果が真となる配列要素が少なくとも1つ存在する場合
真
2
項番1の条件を満たさない場合で,かつ述語の結果が不定となる配列要素が少なくとも1つ存在する場合
不定※
3
項番1と項番2の条件を満たさない場合
偽
注※ NULL述語の場合,項番2の条件は除外されます。したがって,項番1の条件を満たさない場合,述語の結果は偽になります。
ANYを指定した配列要素参照を含む述語の結果は,配列要素ごとに評価が行われる述語をOR条件でつないだ探索条件の結果と同じになります。例を次に示します。
(例)
C1列は,配列要素数が3の配列型の列とします。
ANYを指定した配列要素参照を含む述語
左記の指定と同じ結果になる探索条件
"C1"[ANY] = 1
"C1"[1] = 1 OR "C1"[2] = 1 OR "C1"[3] = 1
-
述語の結果を求める際,同じ識別番号を指定した複数の配列要素参照を,同じ添え字の配列要素ごとに1組と見なします。そして,すべての添え字(複数の配列要素参照の配列値式の中で最も多い配列要素数分)に対してそれぞれ評価が行われます。その際,添え字が配列要素参照の配列値式の配列要素数を超える場合,超えた添え字に対応する値にナル値を補完して評価が行われます。述語の結果は,次の表の内容に従って決定されます。
項番
条件
述語の結果
1
述語の結果が真となる組が少なくとも1つ存在する場合
真
2
項番1の条件を満たさない場合で,かつ述語の結果が不定となる組が少なくとも1つ存在する場合
不定※
3
項番1と項番2の条件を満たさない場合
偽
注※ NULL述語の場合,項番2の条件は除外されます。したがって,項番1の条件を満たさない場合,述語の結果は偽になります。
ANYを指定した配列要素参照を含む述語の結果は,配列要素の組ごとに評価が行われる述語をOR条件でつないだ探索条件の結果と同じになります。例を次に示します。
(例)
C1列は,配列要素数が2の配列型の列とします。C2列は,配列要素数が3の配列型の列とします。
ANYを指定した配列要素参照を含む述語
左記の指定と同じ結果になる探索条件
"C1"[ANY(1)] = "C2"[ANY(1)]
"C1"[1] = "C2"[1] OR
"C1"[2] = "C2"[2] OR
"C1"[3] = "C2"[3]
添え字が配列値式の配列要素数を超える"C1"[3]には,ナル値が補完されて評価が行われます。
-
述語の結果を求める際,異なる識別番号を指定した複数の配列要素参照は,添え字の配列要素ごとに1組と見なし,添え字のすべての組み合わせに対してそれぞれ評価が行われます。述語の結果は,次の表の内容に従って決定されます。
項番
条件
述語の結果
1
述語の結果が真となる組が少なくとも1つ存在する場合
真
2
項番1の条件を満たさない場合で,かつ述語の結果が不定となる組が少なくとも1つ存在する場合
不定※
3
項番1と項番2の条件を満たさない場合
偽
注※ NULL述語の場合,項番2の条件は除外されます。したがって,項番1の条件を満たさない場合,述語の結果は偽になります。
ANYを指定した配列要素参照を含む述語の結果は,配列要素の組ごとに評価が行われる述語をOR条件でつないだ探索条件の結果と同じになります。例を次に示します。
(例)
C1列は,配列要素数が2の配列型の列とします。C2列は,配列要素数が3の配列型の列とします。
ANYを指定した配列要素参照を含む述語
左記の指定と同じ結果になる探索条件
"C1"[ANY(1)] = "C2"[ANY(2)]
"C1"[1] = "C2"[1] OR
"C1"[1] = "C2"[2] OR
"C1"[1] = "C2"[3] OR
"C1"[2] = "C2"[1] OR
"C1"[2] = "C2"[2] OR
"C1"[2] = "C2"[3]
-
-
(4) 例題
- ■添え字に符号なし整数定数を指定する例
-
次に示す表T1を検索対象とするSQL文の実行例を説明します。
C2列は配列型の列で,{ }内の値は各配列要素の値を示しています。
C2列の要素データ型は,INTEGER型とします。
- 例題1
-
表T1のC2列の2番目の配列要素の値を求めます。
SELECT "C2"[2] AS "AER1" FROM "T1"
下線部分が,配列要素参照の指定です。2番目の配列要素の値を求めるため,添え字に2を指定しています。
実行結果の例
C2列の要素データ型がINTEGER型のため,実行結果のデータ型はINTEGER型になります。
- 例題2
-
表T1のC2列の2番目の配列要素の値が1である行のC1列の値を求めます。
SELECT "C1" FROM "T1" WHERE "C2"[2]=1
下線部分が,配列要素参照の指定です。2番目の配列要素の値を検索するため,添え字に2を指定しています。
実行結果の例
- ■添え字にANYを指定する例
-
次に示すREPORT表を検索対象とするSQL文の実行例を説明します。
SUBJECT列およびSCORE列は配列型の列で,{ }内の値は各配列要素の値を示しています。
- 例題1
-
物理を受験している人の名前を求めます。
SELECT "NAME" FROM "REPORT" WHERE "SUBJECT"[ANY] = 'physics'
下線部分が,配列要素参照の指定です。SUBJECT列の配列要素の値に物理(physics)があるかどうかを検索するために,添え字にANYを指定しています。
実行結果の例
- 例題2
-
数学の点数が80点以上で,かつ物理の点数が80点以上の人の名前を求めます。
SELECT "NAME" FROM "REPORT" WHERE "SUBJECT"[ANY(1)] = 'math' AND "SCORE"[ANY(1)] >= 80 ...1 AND "SUBJECT"[ANY(2)] = 'physics' AND "SCORE"[ANY(2)] >= 80 ...2
下線部分が,配列要素参照の指定です。
-
数学の点数が80点以上である条件を指定しています。SUBJECT列の配列要素の値に数学(math)があり,SCORE列の数学の点数を示す配列要素の値が80以上である条件を指定しています。
-
物理の点数が80点以上である条件を指定しています。SUBJECT列の配列要素の値に物理(physics)があり,SCORE列の物理の点数を示す配列要素の値が80以上である条件を指定しています。
- 重要
-
同じ識別番号を指定した配列要素参照は,1つの組と見なされて述語の評価が行われます。上記の1.の配列要素参照には,識別番号に1を指定しているため,1つの組と見なされて述語の評価が行われます。上記の2.の配列要素参照には,識別番号に2を指定しているため,1つの組と見なされて述語の評価が行われます。
実行結果の例
-