2.7.5 述語
- 〈この項の構成〉
(1) 比較述語
- 形式
行値構成子 {=|<>|^=|!=|<|<=|>|>=}行値構成子
述語が真となる場合
-
行値構成子要素が一つの場合
左右の行値構成子要素が,比較条件を満たす場合に真となります。
なお,行値構成子要素のどれかがナル値の場合は不定となります。
-
行値構成子要素が二つ以上の場合
- (=)
-
左右の行値構成子中の対応する要素間の関係が,すべて「=」である場合に真となります。
なお,「<>」が成立する要素の組み合わせが一つ以上存在するときは偽となります。
「<>」が成立する要素の組み合わせがない場合で,比較する要素にナル値が一つ以上存在するときは不定となります。
- ・(真となる例)
-
(1,2,3)=(1,2,3)
('A','B','C')=('A','B','C')
- (<>|^=|!=)
-
左右の行値構成子中の対応する要素を比較し,少なくとも一つ「<>」が成立する組み合わせが存在する場合に真となります。
なお,対応する要素間の関係がすべて「=」である場合は偽となります。
「<>」が成立する組み合わせが一つも存在しない場合で,比較する要素にナル値が一つ以上存在するときは不定となります。
- ・(真となる例)
-
(1,2,3)<>(1,5,3)
('A','B','C')<>('C','A','B')
- (<)
-
左右の行値構成子中の対応する要素を左から順に,「=」が成立する間比較をします。「=」が成立しない最初の要素間に「<」の関係が成立する場合に真となります。
なお,「=」が成立しない最初の要素間の関係が「>」である場合,及び対応する要素間のすべてに「=」が成立する場合は偽となります。
「=」が成立しない最初の要素にナル値が存在する場合は不定となります。
- ・(真となる例)
-
(1,2,3)<(3,1,2)
1番目の要素間の関係が1<3であるため,真となります。
('A','B','C','D')<('A','B','E','A')
左から順に比較し,「=」の成立しない最初の要素間の関係が'C'<'E'であるため,真となります。
- (>)
-
左右の行値構成子中の対応する要素を左から順に,「=」が成立する間比較をします。「=」が成立しない最初の要素間に「>」の関係が成立する場合に真となります。
なお,「=」が成立しない最初の要素間の関係が「<」である場合,又は対応する要素間のすべてに「=」が成立する場合は偽となります。
「=」が成立しない最初の要素にナル値が存在する場合は不定となります。
- ・(真となる例)
-
(1,2,3)>(1,1,5)
左から順に比較し,「=」が成立しない最初の要素間の関係が2>1であるため,真となります。
('A','A',C')>('A','A','A')
左から順に比較し,「=」が成立しない最初の要素間の関係が'C'>'A'であるため,真となります。
- (<=)
-
左右の行値構成子中の対応する要素を左から順に,「=」が成立する間比較をします。「=」が成立しない最初の要素間に「<」の関係が成立する場合,又は対応する要素間のすべてに「=」の関係が成立する場合に真となります。
なお,「=」が成立しない最初の要素間の関係が「>」である場合は偽となります。
「=」が成立しない最初の要素にナル値が存在する場合は不定となります。
- (>=)
-
左右の行値構成子中の対応する要素を左から順に,「=」が成立する間比較をします。「=」が成立しない最初の要素間に「>」の関係が成立する場合,又は対応する要素間のすべてに「=」の関係が成立する場合に真となります。
なお,「=」が成立しない最初の要素間の関係が「<」である場合は偽となります。
「=」が成立しない最初の要素にナル値が存在する場合は不定となります。
各比較述語は,論理演算を用いた形に展開できます。論理演算を用いて展開した形式を次に示します。
演算子
行値構成子を用いた記述
論理演算を用いた記述
=
(Rx1,Rx2,…,Rxn)=(Ry1,Ry2,…,Ryn)
Rx1=Ry1 AND Rx2=Ry2 AND…AND Rxn=Ryn
<>
(Rx1,Rx2,…,Rxn)<>(Ry1,Ry2,…,Ryn)
Rx1<>Ry1 OR Rx2<>Ry2 OR … OR Rxn<>Ryn
<
(Rx1,Rx2,Rx3,…,Rxn)<(Ry1,Ry2,Ry3,…,Ryn)
Rx1<Ry1 OR
(Rx1=Ry1 AND Rx2<Ry2) OR
(Rx1=Ry1 AND Rx2=Ry2 AND Rx3<Ry3) OR … OR (Rx1=Ry1 AND Rx2=Ry2 AND Rx3=Ry3 AND … AND Rxn-1=Ryn-1 AND Rxn<Ryn)
>
(Rx1,Rx2,Rx3,…,Rxn)>(Ry1,Ry2,Ry3,…,Ryn)
Rx1>Ry1 OR
(Rx1=Ry1 AND Rx2>Ry2) OR
(Rx1=Ry1 AND Rx2=Ry2 AND Rx3>Ry3) OR …
OR (Rx1=Ry1 AND Rx2=Ry2 AND Rx3=Ry3 AND … AND Rxn-1=Ryn-1 AND Rxn>Ryn)
規則
-
演算結果のデータ型が,次のデータ型となる値を指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
行値構成子については,「行値構成子」を参照してください。
-
左右の行値構成子中で,同じ位置にある行値構成子要素を対応値とします。対応値のデータ型は比較可能なデータ型にしてください。
-
次に示す箇所の比較述語には,副問合せは指定できません。
-
IF文の探索条件
-
WHILE文の探索条件
-
CREATE TRIGGERのWHEN探索条件(トリガ動作条件)
-
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,対応値との比較結果は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,比較結果は真となります。比較結果が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,その比較結果は不定になります。比較結果が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないと対応値との比較結果は不定になります。
-
比較対象となる行値構成子は,結果の列数を同じにしてください。
-
うるう秒は1分より小さい値として扱われます。
(例)
’00:00:61’ < ’00:01:00’
(2) NULL述語
- 形式
値式 IS 〔NOT〕 NULL
述語が真となる場合
指定した値式の値がナル値である行に対して,NULL述語は真になります。NOTを指定した場合は,ナル値でない行に対して真になります。ナル値については,「ナル値」を参照してください。
規則
-
次のデータ型の値式は,指定できません。
-
BLOB(?パラメタ,又は埋込み変数を単独で指定した場合を除く)
-
定義長が32,001バイト以上のBINARY(?パラメタ,又は埋込み変数を単独で指定した場合を除く)
-
BOOLEAN
-
-
繰返し列を添字なしで指定した場合,その列に要素がないとき(NOT指定の場合は要素が一つ以上あるとき)に,NULL述語は真となります。列のすべての要素がナル値であっても,NULL述語は真とはなりません。
-
繰返し列を添字付きで指定した場合,指定した要素がナル値ならばNULL述語は真となります。
-
繰返し列を添字付きで指定した場合,その要素がないとNULL述語は不定になります。
-
繰返し列を添字付きで指定する場合は,添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,NULL述語は真となります。
- 留意事項
-
-
オーバフローエラー抑止が設定されている場合,値式の演算結果がオーバフローによってナル値となった場合にも,NULL述語は真となります。
-
(3) IN述語
- 形式
行値構成子〔IS〕 〔NOT〕 IN {(行値構成子〔,行値構成子〕…)| 〈表副問合せ〉 (〔副問合せ実行方式のSQL最適化指定〕 SELECT〔{ALL|DISTINCT}〕{選択式|*} 〈表 式〉 FROM 表参照〔,表参照〕… 〔WHERE 探索条件〕 〔GROUP BY 値式〔,値式〕…〕 〔HAVING 探索条件〕)}
述語が真となる場合
次の条件のどちらかを満たしている場合,IN述語は真となります。
-
左側の行値構成子が,右側の任意の行値構成子と一致する場合。
-
左側の行値構成子が,表副問合せの任意の結果行と一致する場合。
NOTを指定した場合は,左側の行値構成子が,右側に指定したすべての行値構成子又は表副問合せのすべての結果行と一致しない行に対して,IN述語は真となります。
規則
-
行値構成子又は表副問合せの結果の各データ項目が,次のデータ型となる値を指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
右側の行値構成子は,最大30,000個指定できます。
-
右側が表副問合せでないIN述語の左辺には,値指定だけの行値構成子を指定できません。
-
表副問合せについては,「副問合せ」を参照してください。
-
IN述語は,限定述語と同じ意味を表すものがあります。同じ意味を表す述語を次に示します。
IN述語
限定述語
行値構成子 IN 表副問合せ
行値構成子 = ANY 表副問合せ
又は
行値構成子 = SOME 表副問合せ
行値構成子 NOT IN 表副問合せ
行値構成子 <> ALL 表副問合せ
-
表副問合せの結果が空集合の場合,IN述語の結果は偽になります。ただし,NOTを指定した場合は真になります。
-
次に示す箇所のIN述語には,表副問合せは指定できません。
-
IF文の探索条件
-
WHILE文の探索条件
-
CREATE TRIGGERのWHEN探索条件(トリガ動作条件)
-
-
各行値構成子中で,同じ位置にある行値構成子要素及び表副問合せの選択式を対応値とします。対応値のデータ型は,変換,又は比較できるデータ型にしてください。ただし,左側に指定した行値構成子中の行値構成子要素の結果のデータ型が各国文字データで,その対応値に文字列定数を指定した場合,文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合,文字コードはチェックされないで,文字データの長さだけがチェックされます。
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,IN述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,IN述語は真となります。IN述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,そのIN述語は不定になります。IN述語が真又は不定でない場合,偽となります。
-
右側の行値構成子には,添字にANYを指定した繰返し列を指定できません。
-
繰返し列を添字付きで指定した場合,その要素がないとIN述語は不定になります。
-
行値構成子の結果がナル値の場合,その対応値の比較結果は不定となります。
-
比較対象となる行値構成子は,結果の列数を同じにしてください。
留意事項
-
IN述語に表副問合せを指定した場合,HiRDBが作業表を作成することがあります。このとき,作業表の行長によっては,IN述語の副問合せの処理が制限されることがあります。作業表の行長については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
(4) LIKE述語
述語が真となる場合
指定した値式の値が,パターン文字列の表すパターンと一致する行に対して,LIKE述語は真になります。NOTを指定した場合は,パターン文字列の表すパターンと一致しない行に対して,述語は真になります。
- (値式)
-
-
値式には,文字列のパターン比較の対象となる値式を指定します。ただし,SQL変数,及びSQLパラメタ以外の値指定だけの値式は指定できません。
-
値式及びパターン文字列に指定できるデータ型は,文字列データ,各国文字列データ,混在文字列データ,又は定義長が32,000バイト以下のBINARYです。
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,LIKE述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,LIKE述語は真となります。LIKE述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,そのLIKE述語は不定になります。LIKE述語が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないとLIKE述語は不定になります。
-
- (パターン文字列)
-
-
パターン文字列には,値指定を指定します。
-
指定できるパターン文字列のデータ型は,値式に指定できるデータ型と同じです。
-
値式のデータ型とパターン文字列のデータ型の組み合わせは,次のとおりです。
値式のデータ型
パターン文字列,又はエスケープ文字列のデータ型
文字列データ
各国文字列
データ
混在文字列
データ
バイナリ
データ
既定文字集合
EBCDIK
UTF16
文字列データ
既定文字集合
○
×
×
×
○
×
EBCDIK
△※3
○
×
×
UTF16
△※3
×
○
各国文字列データ
△※1
×
×
○
×
×
混在文字列データ
○
×
×
×
○
×
バイナリデータ
△※2
×
×
×
×
○
-
値式,パターン文字列,エスケープ文字列の文字集合は,同じにしてください。ただし,パターン文字列,エスケープ文字列が次に示す場合は,値式の文字集合に変換されるので比較できます。
・文字列定数
・埋込み変数(既定文字集合)
・?パラメタ
-
パターン文字列中の特殊文字には,_(下線),%(パーセント),及びエスケープ文字があります。バイナリデータでの特殊文字は,_,%,及びエスケープ文字を表すコードを指定してください。パターン文字列中の特殊文字_と%の意味を次の表に示します。
-
パターン文字列中に%を含まない場合,列のデータとパターン文字列の長さが異なる場合は,この述語は真になりません。
-
値式で指定した文字列とパターン文字列が,可変長データ(VARCHAR,NVARCHAR,MVARCHAR,又はBINARY)の場合は,値式のデータとパターン文字列データとの比較のほかに,データ長も比較します。
-
パターン文字列として埋込み変数,SQL変数,又はSQLパラメタを指定する場合,次のことに注意してください。パターン文字列を固定長の埋込み変数,SQL変数,又はSQLパラメタにした場合に変数の長さより短いパターン文字列を設定すると,変数の後ろに空白が入ったり,残っていた不当文字が値として設定されてしまう場合があります。このようなパターン文字列で検索すると,後ろに空白,又は不当文字と同じ値がないデータは検索されません。したがって,固定長の変数をパターン文字列として使用する場合は,後ろにすべて%を設定する必要があります。
(例)
変数にパターン文字列として'AB%',及び'AB%%'を設定した場合,文字列データが'ABCD'のときの比較を次に示します。
変数のデータ型
パターン文字列
文字列データ
比較結果
可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)
'AB%'
'ABCD'
一致します
'AB%%'
'ABCD'
一致します
固定長文字列(4バイト)
'AB%△'
'ABCD'
一致しません
'AB%%'
'ABCD'
一致します
(例)
変数にパターン文字列としてX'52454425'を設定した場合,バイナリデータが52454452554dのときの比較を次に示します。
変数のデータ型
パターン文字列
バイナリデータ
比較結果
BINARY型
X'52454425'
52454452554d
一致します
X'5245442525'
52454452554d
一致します
-
- パターン文字列の例
-
LIKE述語の代表的なパターン文字列の例を次の表に示します。
表2‒4 LIKE述語の代表的なパターン文字列の例 項 目
パターン文字列
意 味
例
パターン文字列
パターンの一致する文字列
前方一致
nnn%
文字列の先頭部分がnnnです。
'ACT%'
ACT,ACTOR,ACTIONなどACTで始まる文字列
後方一致※1
%nnn
文字列の最後の部分がnnnです。
'%ING'
ING,BEING,HAVINGなどINGで終わる文字列
任意一致
%nnn%
文字列中の任意の部分にnnnを含みます。
N'%日%'
日,日立,昨日,本日中など日を含む文字列※2
完全一致
nnn
文字列がnnnと同じです。
'EQUAL'
EQUAL
部分一致
_…_nnn_…_
文字列中の特定の部分がnnnと同じで,ほかの部分には任意の文字があります。
'_I_'
BIT,HIT,KITなど3文字で2文字目がIの文字列
その他
nnn%mmm
文字列の先頭部分が nnnで,最後の部分がmmmです。
'O%N'
ON,OWN,ORIGINなどOで始まりNで終わる文字列
%nnn%mmm%
文字列中の任意の部分にnnnを含み,その部分より後の任意の部分にmmmを含みます。
'%O%N%'
ON,ONE,DOWN,COUNTなどOを含み,その部分より後にNを含む文字列
nnn_…_mmm%
先頭部分がnnnで始まり,後方にmmmがある文字列です。
'CO_ _ECT%'
CORRECT,
CONNECTOR,
CONNECTIONなどCOで始まり5文字目から7文字目がECTの文字列
- 注
-
nnn,mmmは,%,_を含まない任意の文字列
- 注※1
-
空白も比較対象の文字として扱うため,後方に空白のあるデータと比較した場合,結果は偽になります。
- 注※2
-
各国文字列中での特殊文字(%,_)は,各国文字の「%」,「_」を使用します。
- エスケープ文字
-
パターン文字列中に _(下線)や%(パーセント)を記述すると,無条件に特殊文字とみなされ,通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は,エスケープ文字を指定します。キーワードESCAPEの後に,任意の1文字(エスケープ文字)を指定しておくと,パターン文字列中に記述したエスケープ文字の直後の特殊文字を通常の文字として扱えます。
- (例1)
-
'5%','25%'など,文字列中に'5%'を含む文字列の場合
'%5?%%' ESCAPE '?'
- (例2)
-
'SQLPRINT_REC'など,文字列の最後が'PRINT_REC'となる文字列の場合
'%PRINT@_REC' ESCAPE '@'
- (例3)
-
X'48695244425f'など,バイナリ列中にX'48695244425f'を含む16進文字列の場合
X'4869524442ee5f' ESCAPE X'ee'
エスケープ文字に指定できる文字を次に示します。
項目のデータ型
指定できる文字
文字データ(CHAR,VARCHAR)
既定文字集合
任意の1文字(1バイト文字)※1
EBCDIK
UTF16
任意の1文字※2
混在文字データ(MCHAR,MVARCHAR)
任意の1文字※2
各国文字データ(NCHAR,NVARCHAR)
任意の1文字(2バイト文字)※3
バイナリデータ(BINARY)
任意の1バイトの値
- 注
-
エスケープ文字の次には,必ず特殊文字を指定してください。
- 注※1
-
すべての文字,又はデータ値を1バイト文字として扱います。
- 注※2
-
文字でないデータ値の場合は,その文字コードの最小の長さ(UTF16の場合は長さ2,UTF8,SJISなどの場合は長さ1)の文字として扱います。
- 注※3
-
すべての文字,又はデータ値を2バイト文字として扱います。
- 留意事項
-
-
LIKEの左辺の値式で使用する列の定義長は,255バイト以下(CHAR,VARCHAR,MCHAR,MVARCHAR,及びBINARY)又は,127文字以下(NCHAR,及びNVARCHAR)の方が性能が良くなります。
-
CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合,そのマルチバイト文字は1バイトずつ評価されます。したがって,パターン文字列中に指定した1バイト文字の文字コードが,マルチバイト文字の文字コードに含まれる場合,LIKE述語の結果は真となります。
(例)
sjisの文字コードでセットアップし,表T1にCHAR型の列C1があり,列C1中に「ア」という行がある状態で,次の問合せを実行します。
SELECT C1 FROM T1 WHERE C1 LIKE '%A%' ;
「ア」は,文字コードを16進数で表すと8341となります。パターン文字列中の「A」は,文字コードを16進数で表すと41となります。したがって,マルチバイト文字である「ア」の文字コードの中に,1バイト文字「A」の文字コードを含んでいるため,LIKE述語の結果は真となります。
-
(5) XLIKE述語
述語が真となる場合
指定した値式の値が,パターン文字列の表すパターンと一致する行に対して,XLIKE述語は真になります。NOTを指定した場合は,パターン文字列の表すパターンと一致しない行に対して,述語は真になります。ただし,比較するときに大文字と小文字が区別されないため,同等に扱われます。
- (値式)
-
-
値式には,文字列のパターン比較の対象となる列を指定します。ただし,SQL変数,及びSQLパラメタ以外の値指定だけの値式は指定できません。
-
指定できる値式のデータ型は,文字列データ,各国文字データ,又は混在文字列データです。
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,XLIKE述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,XLIKE述語は真となります。XLIKE述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,そのXLIKE述語は不定になります。XLIKE述語が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないとXLIKE述語は不定になります。
-
- (パターン文字列)
-
-
パターン文字列には,値指定を指定します。
-
指定できるパターン文字列のデータ型は,値式に指定できるデータ型と同じです。
-
値式のデータ型とパターン文字列のデータ型の組み合わせは,次のとおりです。
値式のデータ型
パターン文字列,又はエスケープ文字のデータ型
文字列データ
各国文字列
データ
混在文字列
データ
既定
文字集合
EBCDIK
UTF16
文字列データ
既定文字集合
○
×
×
×
○
EBCDIK
△※2
○
×
×
UTF16
△※2
×
○
各国文字列データ
△※1
×
×
○
×
混在文字列データ
○
×
×
×
○
-
値式,パターン文字列,エスケープ文字列の文字集合は,同じにしてください。ただし,パターン文字列,エスケープ文字列が次に示す場合は,値式の文字集合に変換されるので比較できます。
・文字列定数
・埋込み変数(既定文字集合)
・?パラメタ
-
パターン文字列中の特殊文字には,_(下線),%(パーセント),及びエスケープ文字があります。パターン文字列中の特殊文字のうち_と%の意味を次の表に示します。
-
パターン文字列データの比較時に,大文字と小文字の区別をしない文字を次に示します。
・'A'〜'Z'と'a'〜'z'
・'ア'〜'オ','ヤ','ユ','ヨ','ツ'と'ァ'〜'ォ','ャ','ュ','ョ','ッ'
・'-'(ハイフン)と'ー'(長音)
・'あ'〜'お','や','ゆ','よ','つ'と'ぁ'〜'ぉ','ゃ','ゅ','ょ','っ'
(各国文字及び混在文字)
-
パターン文字列中に%を含まない場合,列のデータとパターン文字列の長さが異なる場合は,この述語は真になりません。
-
値式で指定した文字列とパターン文字列が,可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)の場合は,文字列データとパターン文字列データとの比較のほかに文字列長も比較します。
-
パターン文字列として埋込み変数,SQL変数,又はSQLパラメタを指定する場合,次のことに注意してください。パターン文字列を固定長の埋込み変数,SQL変数,又はSQLパラメタにした場合に変数の長さより短いパターン文字列を設定すると,変数の後ろに空白が入ったり,残っていた不当文字が値として設定されたりしてしまう場合があります。このようなパターン文字列で検索すると,後ろに空白,又は不当文字と同じ値がないデータは検索されません。したがって,固定長の変数をパターン文字列として使用する場合は,後ろにすべて%を設定する必要があります。
-
- パターン文字列の例
-
XLIKE述語の代表的なパターン文字列の例を次の表に示します。
表2‒6 XLIKE述語の代表的なパターン文字列の例 項 目
パターン文字列
意 味
例
パターン文字列
パターンの一致する文字列
前方一致
nnn%
文字列の先頭部分がnnnです。
'ACT%'
ACT,Actor,ActionなどACT※1で始まる文字列
後方一致
%nnn
文字列の最後の部分がnnnです。
'%ING'
Ing,Being,HAVINGなどING※2で終わる文字列
任意一致
%nnn%
文字列中の任意の部分にnnnを含みます。
'%or%'
OR,More,CoLorなどor※3を含む文字列
完全一致
nnn
文字列がnnnと同じです。
'MAX'
MAX,max,mAx※4などの文字列
部分一致
_…_nnn_…_
文字列中の特定の部分がnnnと同じで,ほかの部分には任意の文字があります。
'_I_'
Bit,HIT,Kitなど3文字で2文字目がIの文字列
その他
nnn%mmm
文字列の先頭部分がnnnで,最後の部分がmmmです。
'O%N'
on,Own,ORIGINなどOかoで始まりNかnで終わる文字列
%nnn%mmm%
文字列中の任意の部分にnnnを含み,その部分より後の任意の部分にmmmを含みます。
'%O%N%'
ON,one,DowN,CountなどOかoを含み,その部分より後にNかnを含む文字列
nnn_…_mmm%
先頭部分がnnnで始まり,後方にmmmがある文字列です。
'CO_ _ECT%'
correct,Connector,
CONNECTIONなど
CO※5で始まり5文字目から7文字目がECT※6の文字列
- 注1
-
nnn,mmmは,%,_を含まない任意の文字列
- 注2
-
空白も比較対象の文字として扱うため,後方に空白のあるデータと比較した場合,結果は偽になります。
- 注3
-
各国文字列中での特殊文字(%,_)は,各国文字の「%」,「_」を使用します。
- 注※1
-
ACT,ACt,AcT,Act,aCT,aCt,acT,actのどれかの文字列
- 注※2
-
ING,INg,Ing,InG,iNG,iNg,inG,ingのどれかの文字列
- 注※3
-
OR,Or,oR,orのどれかの文字列
- 注※4
-
MAX,MAx,Max,MaX,mAX,mAx,maX,maxのどれかの文字列
- 注※5
-
CO,Co,cO,coのどれかの文字列
- 注※6
-
ECT,ECt,Ect,EcT,eCT,eCt,ecT,ectのどれかの文字列
- エスケープ文字
-
パターン文字列中に _(下線)や %(パーセント)を記述すると,無条件に特殊文字とみなされ,通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は,エスケープ文字を指定します。キーワードESCAPEの後に,任意の1文字(エスケープ文字)を指定しておくと,パターン文字列中に記述したエスケープ文字の直後の特殊文字を通常の文字として扱えます。
- (例1)
-
'5%','25%'など,文字列中に'5%'を含む文字列の場合
'%5?%%' ESCAPE '?'
- (例2)
-
'SQLPRINT_REC'など,文字列の最後が'PRINT_REC'となる文字列の場合
'%PRINT@_REC' ESCAPE '@'
エスケープ文字に指定できる文字を次に示します。
項目のデータ型
指定できる文字
文字データ(CHAR,VARCHAR)
既定文字集合
任意の1文字(1バイト文字)※1
EBCDIK
UTF16
任意の1文字※2
混在文字データ(MCHAR,MVARCHAR)
任意の1文字※2
各国文字データ(NCHAR,NVARCHAR)
任意の1文字(2バイト文字)※3
- 注
-
エスケープ文字の次には,必ず特殊文字を指定してください。
- 注※1
-
すべての文字,又はデータ値を1バイト文字として扱います。
- 注※2
-
文字でないデータ値の場合は,その文字コードの最小の長さ(UTF16の場合は長さ2,UTF8,SJISなどの場合は長さ1)の文字として扱います。
- 注※3
-
すべての文字,又はデータ値を2バイト文字として扱います。
- 留意事項
-
-
XLIKEの左辺の値式で使用する列の定義長は,255バイト以下(CHAR,VARCHAR,MCHAR,及びMVARCHAR),又は127文字以下(NCHAR,及びNVARCHAR)の方が性能が良くなります。
-
CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合,そのマルチバイト文字は1バイトずつ評価されます。したがって,パターン文字列中に指定した1バイト文字の文字コードが,マルチバイト文字の文字コードに含まれる場合,XLIKE述語の結果は真となります。
- (例)
-
sjisの文字コードでセットアップし,表T1にCHAR型の列C1があり,列C1中に「ア」という行がある状態で,次の問合せを実行します。
SELECT C1 FROM T1 WHERE C1 XLIKE '%A%' ;
「ア」は,文字コードを16進数で表すと8341となります。パターン文字列中の「A」は,文字コードを16進数で表すと41となります。したがって,マルチバイト文字である「ア」の文字コードの中に,1バイト文字「A」の文字コードを含んでいるため,XLIKE述語の結果は真となります。
-
(6) SIMILAR述語
述語が真となる場合
指定した値式の値がパターン文字列の表すパターンと一致する行に対して,SIMILAR述語は真になります。NOTを指定した場合は,パターン文字列の表すパターンと一致しない行に対して,述語は真になります。ただし,パターン文字列の長さが0の場合,値式の長さが0のときにSIMILAR述語は真になります。
規則
- (値式)
-
-
値式には,文字列のパターン比較の対象となる値式を指定します。ただし,?パラメタ,及び埋込み変数の値指定だけの値式は指定できません。
-
値式及びパターン文字列に指定できるデータ型は,文字列データ,各国文字列データ,混在文字列データ,又は定義長が32,000バイト以下のBINARYです。
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,SIMILAR述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,SIMILAR述語は真となります。SIMILAR述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定の場合,そのSIMILAR述語は不定になります。SIMILAR述語が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないとSIMILAR述語は不定になります。
-
- (パターン文字列)
-
-
パターン文字列には,値式を指定します。
-
値式に繰返し列は指定できません。
-
値式のデータ型とパターン文字列のデータ型の組み合わせを,次の表に示します。
値式のデータ型
パターン文字列,又はエスケープ文字のデータ型
文字列データ
各国文字列
データ
混在文字列
データ
バイナリ
データ
既定文字集合
EBCDIK
UTF16
文字列データ
既定文字集合
○
×
×
×
○
×
EBCDIK
△※3
○
×
×
UTF16
△※3
×
○
各国文字列データ
△※1
×
×
○
×
×
混在文字列データ
○
×
×
×
○
×
バイナリデータ
△※2
×
×
×
×
○
-
値式,パターン文字列,エスケープ文字列の文字集合は,同じにしてください。ただし,パターン文字列,エスケープ文字列が次に示す場合は,値式の文字集合に変換されるので比較できます。
・文字列定数
・埋込み変数(既定文字集合)
・?パラメタ
-
パターン文字列に指定する正規表現の形式を次に示します。
正規表現 ::= 正規項 | 正規表現 垂直棒 正規表現 正規項 ::= 正規因子| 正規項 正規因子 正規因子 ::= 正規一次子 | 正規一次子 * | 正規一次子 + | 正規一次子 ? | 正規一次子 繰返し因子 繰返し因子 ::= 左波括弧 下限値 [ 上限指定 ] 右波括弧 上限指定 ::= コンマ [ 上限値 ] 正規一次子 ::= 文字指定子 | % | 正規文字集合 | 正規文字集合識別子指定 | 左括弧 正規表現 右括弧 文字指定子 ::= エスケープされない文字 | エスケープされた文字 正規文字集合 ::= _ | 左角括弧 文字列挙… 右角括弧 | 左角括弧 ^ 文字列挙… 右角括弧 文字列挙 ::= 文字指定子 | 文字指定子 負符号 文字指定子 | 正規文字集合識別子指定 正規文字集合識別子指定 ::= 左角括弧 コロン 正規文字集合識別子 コロン 右角括弧
-
パターン文字列に指定する正規表現の構文規則を次に示します。
・正規文字集合識別子には次のどれかを指定します。
’ALPHA’,’UPPER’,’LOWER’,’DIGIT’,’ALNUM’,’SPACE’,’WHITESPACE’
・エスケープされない文字には,特殊文字を除く任意の1文字を指定します。特殊文字を次に示します。
特殊文字
バイナリデータで指定するコード
文字集合なし
文字集合あり
EBCDIK
UTF16
_(下線文字)
X’5F’
X’6D’
U+005F
%(パーセント)
X’25’
X’6C’
U+0025
*(アスタリスク)
X’2A’
X’5C’
U+002A
+(正符号)
X’2B’
X’4E
U+002B
?(疑問符)
X’3F’
X’6F’
U+003F
|(垂直棒)
X’7C’
X’4F’
U+007C
((左括弧)
X’28’
X’4D’
U+0028
)(右括弧)
X’29’
X’5D’
U+0029
{(左波括弧)
X’7B’
X’C0’
U+007B
}(右波括弧)
X’7D’
X’D0’
U+007D
[(左角括弧)
X’5B’
X’4A’
U+005B
](右角括弧)
X’5D’
X’5A’
U+005D
エスケープ文字
ESCAPEに指定した値
-(負符号)※
X’2D’
X’60’
U+002D
:(コロン)※
X’3A’
X’7A’
U+003A
^(サーカムフレックス)※
X’5E’
X’5F’
U+005E
注※ 文字列挙中でだけ特殊文字として扱います。
・エスケープされた文字には,特殊文字そのものを指定したい場合に,エスケープ文字に続けてエスケープする特殊文字を指定します。
・下限値と上限値には,0≦下限値≦上限値≦256を満たす整数を指定します。
-
パターン文字列に指定する正規表現の各指定の意味を,次の表に示します。
[:WHITESPACE:]に含まれる文字の文字コードを次の表に示します。
Unicode(UTF-8)
シフトJIS漢字
EUC日本語漢字,
EUC中国語漢字
中国語漢字(GB18030)
LANG-C
Unicode規格で定められた文字の名前
既定文字集合
UTF16
既定文字集合
EBCDIK
X’09’
U+0009
X’09’
X’05’
X’09’
X’09’
X’09’
Horizontal Tabulation
X’0A’
U+000A
X’0A’
X’15’
X’0A’
X’0A’
X’0A’
Line Feed
X’0B
U+000B
X’0B
X’0B’
X’0B
X’0B
X’0B
Vertical Tabulation
X’0C’
U+000C
X’0C’
X’0C’
X’0C’
X’0C’
X’0C’
Form Feed
X’0D’
U+000D
X’0D’
X’0D’
X’0D’
X’0D’
X’0D’
Carriage Return
X’20’
U+0020
X’20’
X’40’
X’20’
X’20’
X’20’
Space
X’C285’
U+0085
−
−
−
X’81308135’
−
Next Line※
X’C2A0’
U+00A0
−
−
−
X’81308432’
−
No-Break Space※
X’E19A80’
U+1680
−
−
−
X’8134AC34’
−
Ogham Space Mark※
X’E28080’
U+2000
−
−
−
X’8136A336’
−
En Quad※
X’E28081’
U+2001
−
−
−
X’8136A337’
−
Em Quad※
X’E28082’
U+2002
−
−
−
X’8136A338’
−
En Space※
X’E28083’
U+2003
−
−
−
X’8136A339’
−
Em Space※
X’E28084’
U+2004
−
−
−
X’8136A430’
−
Three-Per-Em Space※
X’E28085’
U+2005
−
−
−
X’8136A431’
−
Four-Per-Em Space※
X’E28086’
U+2006
−
−
−
X’8136A432’
−
Six-Per-Em Space※
X’E28087’
U+2007
−
−
−
X’8136A433’
−
Figure Space※
X’E28088’
U+2008
−
−
−
X’8136A434’
−
Punctuation Space※
X’E28089’
U+2009
−
−
−
X’8136A435’
−
Thin Space※
X’E2808A’
U+200A
−
−
−
X’8136A436’
−
Hair Space※
X’E280A8’
U+2028
−
−
−
X’8136A635’
−
Line Separator※
X’E280A9’
U+2029
−
−
−
X’8136A636’
−
Paragraph Separator※
X’E280AF’
U+202F
−
−
−
X’8136A732’
−
Narrow No-Break Space※
X’E38080’
U+3000
0x8140
−
X’A1A1’
X’A1A1’
−
Ideographic Space※
-
正規文字集合識別子指定はバイナリデータでは指定できません。
-
パターン文字列として埋込み変数,SQL変数,又はSQLパラメタを指定する場合,次のことに注意してください。
パターン文字列を固定長の埋込み変数,SQL変数,又はSQLパラメタにした場合に,変数の長さより短いパターン文字列を設定すると,変数の後ろに空白が入ったり,残っていた不当文字が値として設定されてしまうことがあります。このようなパターン文字列で検索すると,後ろに空白,又は不当文字と同じ値がないデータは検索されません。したがって,固定長の変数をパターン文字列として使用する場合は,後ろにすべて%を設定してください。
(例1)
変数にパターン文字列として'AB%',及び'AB%%'を設定した場合,文字列データが'ABCD'のときの比較結果を次に示します。
変数のデータ型
パターン文字列
文字列データ
比較結果
可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)
'AB%'
'ABCD'
一致します。
'AB%%'
'ABCD'
一致します。
固定長文字列(4バイト)
'AB%△'
'ABCD'
一致しません。
'AB%%'
'ABCD'
一致します。
(例2)
変数にパターン文字列としてX'52454425'を設定した場合,バイナリデータが52454452554dのときの比較を次に示します。
変数のデータ型
パターン文字列
バイナリデータ
比較結果
BINARY型
X'52454425'
52454452554d
一致します。
X'5245442525'
52454452554d
一致します。
-
- 不正なパターン文字列
-
-
パターン文字列が不正(KFPA11424-Eメッセージを出力)となる条件を次に示します。
関連する項目
条件
不正なパターン文字列の例
正規一次子*
正規一次子+
正規一次子?
* , + , ?の直前の正規一次子が指定されていない。
‘(*)’,‘(+)’,’(?)’
正規表現|正規表現
|の前後のどちらかに正規表現が指定されていない。
‘a|’,’(a|)’,’(a||b)’
(正規表現)
()内に正規表現が指定されていない。
‘()’
(と)が対応していない。
‘(abc’,’abc)’
正規一次子{n}
正規一次子{n,m}
正規一次子{n,}
繰返し因子の直前の正規一次子が指定されていない。
‘{4}’
繰返し因子の繰り返し回数の指定が不正。
‘a{-1}’,’a{4,2}’
{と}が対応していない。
‘a{4’,’a4}’
[文字列挙…]
[^文字列挙…]
文字列挙にエスケープされていない特殊文字を含んでいる。ただし,正規文字集合識別指定は指定できる。
‘[a%c]’
-の前後の文字指定が不正。
‘[-]’,‘[c-a]’,‘[a--]‘
[]内に文字列挙の指定がない。
‘[]’,‘[^]’
[と]が対応していない。
‘[a-c’,’a-c]’
エスケープ文字
パターン文字列の最後の文字がエスケープ文字である。
‘abc\’(エスケープ文字として’\’を指定した場合)
正規文字集合識別指定
正規文字集合識別子が不正である。
‘[:INVALID:]’
-
- パターン文字列の例
-
SIMILAR述語の代表的なパターン文字列の例を次の表に示します。
表2‒8 SIMILAR述語の代表的なパターン文字列の例 項 目
パターン文字列
意 味
例
パターン文字列
パターンの一致する文字列
前方一致
nnn%
文字列の先頭部分がnnnです。
'ACT%'
ACT,ACTOR,ACTIONなどACTで始まる文字列
後方一致※1
%nnn
文字列の最後の部分がnnnです。
'%ING'
ING,BEING,HAVINGなどINGで終わる文字列
任意一致
%nnn%
文字列中の任意の部分にnnnを含みます。
N'%日%'
日,日立,昨日,本日中など日を含む文字列※2
完全一致
nnn
文字列がnnnと同じです。
'EQUAL'
EQUAL
部分一致
_…_nnn_…_
文字列中の特定の部分がnnnと同じで,ほかの部分には任意の文字があります。
'_I_'
BIT,HIT,KITなど3文字で2文字目がIの文字列
1回以上の繰り返し
mmm[0-9]+
又は
mmm[:DIGIT:]+
文字列の先頭部分がmmmで,その後ろが数値です。
'KFPA11[0-9]+-E '
又は
'KFPA11[:DIGIT :]+-E'’
KFPA11104-E,KFPA11901-EなどKFPA11で始まり7文字目から数値で数値の後が-Eの文字列
幾つかの文字の選択
mmm(n|o)
又は
mmm[no]
文字列の先頭部分がmmmで,i文字目がn又はoです(iは任意の数字)。
'KFPA%-(W|E)'
又は
'KFPA%-[WE]'
KFPA20008-W,KFPA11901-EなどKFPAで始まり最後の2文字が-W又は-Eの文字列
0回以上,1回以下の繰り返し
nnno?mmm
文字列の先頭部分がnnn,最後の部分がmmmでその間にoがある又はないです。
'OW?N'
ON,OWNなどOで始まりNで終わる文字列の間にWがある文字列とない文字列
0回以上の繰り返し
nnno*mmm
文字列の先頭部分がnnn,最後の部分がmmmでその間にoが0回以上繰り返します。
10*1
11,101,1001など最初の文字が1でそれ以降に0が0回以上繰り返され最後に1の文字列
n回の繰り返し
mmm{n}
文字列の先頭部分がmmmでn回繰り返します。
[1-9]0{3}
1000,2000,3000など最初の文字が1〜9でそれ以降0が3回繰り返される文字列
その他
nnn%mmm
文字列の先頭部分がnnnで,最後の部分がmmmです。
'O%N'
ON,OWN,ORIGINなどOで始まりNで終わる文字列
%nnn%mmm%
文字列中の任意の部分にnnnを含み,その部分から後の任意の部分にmmmを含みます。
'%O%N%'
ON,ONE,DOWN,COUNTなどOを含み,その部分より後にNを含む文字列
nnn_…_mmm%
先頭部分がnnnで始まり,後方にmmmがある文字列です。
'CO_ _ECT%'
CORRECT,
CONNECTOR,
CONNECTIONなどCOで始まり5文字目から7文字目がECTの文字列
- 注
-
nnn,mmmは,特殊文字を含まない任意の文字列
- 注※1
-
空白も比較対象の文字として扱うため,後方に空白のあるデータと比較した場合,結果は偽になります。
- 注※2
-
各国文字列中での特殊文字は,各国文字に合わせた特殊文字を使用します。
- (エスケープ文字)
-
パターン文字列中の特殊文字は通常の文字として扱えません。特殊文字を通常の文字として扱いたい場合は,エスケープ文字を指定します。キーワードESCAPEの後に,任意の1文字(エスケープ文字)を指定しておくと,パターン文字列中に記述したエスケープ文字の直後の特殊文字を,通常の文字として扱えます。エスケープ文字には,文字定数,?パラメタ,埋込み変数,SQL変数名,SQLパラメタ名を指定できます。
- (例1)
-
'5%','25%'など,文字列中に'5%'を含む文字列の場合
'%5\%%' ESCAPE '\'
- (例2)
-
'SQLPRINT_REC'など,文字列の最後が'PRINT_REC'となる文字列の場合
'%PRINT\_REC' ESCAPE '\'
- (例3)
-
X'48695244425f'など,バイナリ列中にX'48695244425f'を含む16進文字列の場合
X'4869524442ee5f' ESCAPE X'ee'
エスケープ文字に指定できる文字を次に示します。
項目のデータ型
指定できる文字
文字データ(CHAR,VARCHAR)
既定文字集合
任意の1文字(1バイト文字)※1
EBCDIK
UTF16
任意の1文字※2
混在文字データ(MCHAR,MVARCHAR)
任意の1文字※2
各国文字データ(NCHAR,NVARCHAR)
任意の1文字(2バイト文字)※3
バイナリデータ(BINARY)
任意の1バイトの値
- 注
-
エスケープ文字の次には,必ず特殊文字を指定してください。
- 注※1
-
すべての文字,又はデータ値を1バイト文字として扱います。
- 注※2
-
文字でないデータ値の場合は,その文字コードの最小の長さ(UTF16の場合は長さ2,UTF8,SJISなどの場合は長さ1)の文字として扱います。
- 注※3
-
すべての文字,又はデータ値を2バイト文字として扱います。
- 留意事項
-
-
SIMILARの左辺の値式で使用する列の定義長は,255バイト以下(CHAR,VARCHAR,MCHAR,MVARCHAR,及びBINARY)又は,127文字以下(NCHAR,及びNVARCHAR)の方が性能が良くなります。
-
CHAR型及びVARCHAR型の列にマルチバイト文字が格納されている場合,そのマルチバイト文字は1バイトずつ評価されます。したがって,パターン文字列中に指定した1バイト文字の文字コードが,マルチバイト文字の文字コードに含まれる場合,SIMILAR述語の結果は真となります。
(例)
sjisの文字コードでセットアップし,表T1にCHAR型の列C1があり,列C1中に「ア」という行がある状態で,次の問合せを実行します。
SELECT C1 FROM T1 WHERE C1 SIMILAR TO '%A%' ;
「ア」は,文字コードを16進数で表すと8341となります。パターン文字列中の「A」は,文字コードを16進数で表すと41となります。したがって,マルチバイト文字である「ア」の文字コードの中に,1バイト文字「A」の文字コードを含んでいるため,SIMILAR述語の結果は真となります。
-
パターン文字列が極端に長い場合や,特殊文字{}を連続して指定した場合,検索性能が劣化したり,メモリ使用量が増大したりすることがあります。
-
(7) BETWEEN述語
- 形式
行値構成子1 〔NOT〕 BETWEEN 行値構成子2 AND 行値構成子3
述語が真となる場合
次の条件を満足する行に対して,BETWEEN述語は真になります。
行値構成子2 ≦ 行値構成子 1 ≦ 行値構成子3
NOTを指定した場合は,条件を満足しない行に対して,この述語は真になります。
規則
(行値構成子1)
-
値指定だけの行値構成子要素は指定できません。
-
繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,BETWEEN述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,BETWEEN述語は真となります。BETWEEN述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,そのBETWEEN述語は不定になります。BETWEEN述語が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないとBETWEEN述語は不定になります。
(行値構成子2及び行値構成子3)
-
繰返し列を指定できません。
(共通)
-
各行値構成子中で,同じ位置にある行値構成子要素を対応値とします。対応値のデータ型は,それぞれ変換できるデータ型にしてください。ただし,行値構成子1に各国文字データを指定し,行値構成子2,又は行値構成子3の対応値に文字列定数を指定した場合,文字列定数を各国文字列定数とみなします。文字列定数を各国文字列定数とみなした場合,文字コードはチェックされないで,文字データの長さだけがチェックされます。
-
行値構成子1,行値構成子2及び行値構成子3には,次のデータ型の値を指定できません。
-
BLOB
-
最大長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
行値構成子1,行値構成子2及び行値構成子3は,結果の列数を同じにしてください。
(8) 限定述語
- 形式
行値構成子{=|<>|^=|!=|<|<=|>|>=} {{ANY|SOME}|ALL} 〈表副問合せ〉 (〔副問合せ実行方式のSQL最適化指定〕 SELECT〔{ALL|DISTINCT}〕{選択式|*} 〈表 式〉 FROM 表参照〔,表参照〕… 〔WHERE 探索条件〕 〔GROUP BY 値式〔,値式〕…〕 〔HAVING 探索条件〕)
述語が真となる場合
ANY,又はSOMEを指定した場合,表副問合せの結果の任意の行が一つでも行値構成子との比較条件を満たしていれば,限定述語の結果は真になります。
ALLを指定した場合,表副問合せの結果のすべての行が行値構成子との比較条件を満たしているか,又は表副問合せの結果が空集合であれば,限定述語の結果は真になります。
規則
-
演算結果のデータ型が,次のデータ型となる値を指定できません。
-
BLOB
-
定義長が32,001バイト以上のBINARY
-
BOOLEAN
-
抽象データ型
-
-
行値構成子の結果がナル値である行に対して,この述語は不定になります。
-
表副問合せについては,「副問合せ」を参照してください。
-
限定述語のSOME指定とANY指定のどちらを指定しても処理は同じです。
-
限定述語は,IN述語と同じ意味を表すものがあります。同じ意味を表す述語を次に示します。
限定述語
IN述語
行値構成子 = ANY 表副問合せ
又は
行値構成子 = SOME 表副問合せ
行値構成子 IN 表副問合せ
行値構成子 <> ALL 表副問合せ
行値構成子 NOT IN 表副問合せ
-
ANY,又はSOMEを指定した限定述語の結果を次の表に示します。表副問合せの結果の任意の行が一つでも条件を満たしていれば真になります。すべての行の比較結果がすべて偽であるか,又は表副問合せの結果が空集合であれば偽になります。どちらでもなければ不定になります。
表2‒9 ANY,又はSOMEを指定した限定述語の結果 副問合せの各行に対する比較結果
限定述語の結果(ANY又はSOME)
真の行あり
真
真の行なし
不定あり
不定
不定なし
偽
空集合
偽
-
ALLを指定した限定述語の結果を次の表に示します。表副問合せの結果のすべての行の比較結果が真であるか,又は表副問合せの結果が空集合であれば真になります。任意の行が一つでも偽であれば偽になります。どちらでもなければ不定になります。
表2‒10 ALLを指定した限定述語の結果 副問合せの各行に対する比較結果
限定述語の結果(ALL)
偽の行あり
偽
偽の行なし
不定あり
不定
不定なし
真
空集合
真
-
次に示す箇所には,限定述語は指定できません。
-
IF文の探索条件
-
WHILE文の探索条件
-
CREATE TRIGGERのWHEN探索条件(トリガ動作条件)
-
-
行値構成子要素に繰返し列を指定する場合は,添字を指定してください。繰返し列を添字付きで指定して,その要素が条件を満たしている場合,限定述語は真となります。
-
繰返し列の添字としてANYを指定できます。ANYを指定した場合は,その列の少なくとも一つの要素が条件を満たしていれば,限定述語は真となります。限定述語が真でなく,その列の少なくとも一つの要素に対して指定した条件が不定ならば,その限定述語は不定になります。限定述語が真又は不定でない場合,偽となります。
-
繰返し列を添字付きで指定した場合,その要素がないと限定述語は不定になります。
-
限定述語の左辺に指定した行値構成子の結果の列数と,表副問合せの結果の列数は同じにしてください。
留意事項
-
限定述語を指定した場合,HiRDBが作業表を作成することがあります。このとき,作業表の行長によっては,限定述語の処理が制限されることがあります。作業表の行長については,マニュアル「HiRDB システム導入・設計ガイド」を参照してください。
(9) EXISTS述語
- 形式
EXISTS 〈表副問合せ〉 (〔副問合せ実行方式のSQL最適化指定〕 SELECT〔{ALL|DISTINCT}〕{選択式|*} 〈表 式〉 FROM 表参照〔,表参照〕… 〔WHERE 探索条件〕 〔GROUP BY 値式〔,値式〕…〕 〔HAVING 探索条件〕)
述語が真となる場合
表副問合せの結果が空集合でなければ,EXISTS述語の結果は真になります。
規則
-
表副問合せについては,「副問合せ」を参照してください。
-
EXISTS述語は,表副問合せの結果が空集合でないかどうかをテストする述語です。
-
EXISTS述語の結果を次の表に示します。表副問合せの結果が1行以上であれば真になります。空集合であれば偽になります。
表2‒11 EXISTS述語の結果 副問合せの結果,問合せ条件に合った行の数
EXIST述語の結果
1行以上
真
0行
偽
-
次に示す箇所には,EXISTS述語は指定できません。
-
IF文の探索条件
-
WHILE文の探索条件
-
CREATE TRIGGERのWHEN探索条件(トリガ動作条件)
-
(10) 論理述語
- 形式
値式 IS 〔NOT〕 {TRUE|FALSE|UNKNOWN}
述語が真となる場合
値式の論理値が,指定した真(TRUE),偽(FALSE),又は不定(UNKNOWN)と一致する場合,論理述語は真になります。NOTを指定した場合は,値式の論理値が,指定した真(TRUE),偽(FALSE),又は不定(UNKNOWN)と一致しない場合に真となります。
規則
-
論理述語を評価した場合の述語の結果を次の表に示します。NOTを指定した場合は,表中の各論理値が反転します。
表2‒12 論理述語を評価した場合の述語の結果 値式の論理値
IS TRUE
IS FALSE
IS UNKNOWN
真
真
偽
偽
偽
偽
真
偽
不定
偽
偽
真
-
値式には,次のデータ型の値を指定できます。
-
BOOLEAN
-
-
論理値が不定であることと,論理値がナル値であることは等価です。
(11) 構造化繰返し述語
- 形式
ARRAY(列指定〔,列指定〕…)[ANY](探索条件)
述語が真となる場合
ARRAY(列指定〔,列指定〕…)に指定した繰返し列を,添字が同じ要素の組とした複数項目の繰り返しとみなし,そのどれかの要素が探索条件を満たす場合,構造化繰返し述語は真となります。
規則
- ARRAY(列指定〔,列指定〕…)
-
-
列指定には,構造化する繰返し列を指定します。
-
列指定は,一つのインデクス構成列にすべて含まれるようにしてください。
-
列指定に次に示す列は指定できません。
・異なる表の列
・異なる表から導出した列
ただし,異なる表には,実表が同じで相関名が異なるものも含みます。
-
列指定は,外への参照をする列を指定できません。
-
列指定は,同じ列を2回以上指定できません。
-
列指定は,最大64個指定できます。
-
- 探索条件
-
探索条件を指定します。ただし,構造化繰返し述語についての次の規則があります。
-
探索条件には,次のものを指定できません。
・添字付きの列指定
・ARRAY(列指定〔,列指定〕…)で指定した繰返し列以外の列
・システム定義スカラ関数,関数呼出し,及びIS_USER_CONTAINED_IN_HDS_GROUPを含む述語
・構造化繰返し述語
・XMLEXISTS述語
・列指定を含まない述語
・副問合せ
-
NULL述語を指定した場合,その列に要素がないときは,NULL述語は不定になります。指定した要素がナル値ならばNULL述語は真になります。
-
- 共通
-
-
構造化繰返し述語を含む探索条件は,NOTで否定できません。
-
IF文,WHILE文の探索条件に,構造化繰返し述語は指定できません。
-
HAVING句に,構造化繰返し述語は指定できません。
-
CASE式の探索条件に,構造化繰返し述語は指定できません。
-
構造化繰返し述語を含んでいて,かつオペランドの探索条件に次に示す列(外への参照をする列を除く)があるORは指定できません。
・異なる表の列
・異なる表から導出した列
ただし,異なる表には,実表が同じで相関名が異なるものも含みます。
-
ビュー定義の導出問合せ式中の探索条件には指定できません。
-
外結合の結合表を含む問合せ指定のON 探索条件に構造化繰返し述語を指定する場合,列指定には内表の列を指定してください。
-
外結合の結合表を含む問合せ指定のWHERE句に構造化繰返し述語を指定する場合,列指定には外結合の最も外側の表の列を指定してください。
-
- 使用例
-
成績表から,数学の成績が85点以上の氏名を求めます。なお,成績表は科目名,成績が要素10の繰返し列となっています。
SELECT 氏名 FROM 成績表 WHERE ARRAY(科目名,成績)[ANY](科目名='数学' AND 成績>=85)