4.5.8 述語の構文規則

ここでは,述語の構文について説明します。

FROM句のON条件やWHERE句に指定する検索条件は,述語によって表現します。述語では,次のような演算ができます。

これらの演算では,評価が「真」,「偽」または「不定」として得られます。

<この項の構成>
(1) 形式
(2) <検索条件>
(3) <述語>
(4) <比較述語>
(5) <論理述語>
(6) <Between述語>
(7) <In述語>
(8) <Like述語>
(9) <Null述語>
(10) <Exists述語>

(1) 形式

!! <検索条件>の形式
<検索条件> ::= <左括弧> <検索条件> <右括弧>
       |<述語>
       |NOT <検索条件>
       |<検索条件> OR <検索条件>
       |<検索条件> AND <検索条件>
 
!! <述語>の形式
<述語> ::= <比較述語>
     |<論理述語>
     |<Between述語>
     |<In述語>
     |<Like述語>
     |<Null述語>
     |<Exists述語>
 
!! <比較述語>の形式
<比較述語> ::= <値式> <比較演算子> <比較述語値式>
<比較述語値式> ::= <値式>|<副問い合わせ>
<比較演算子> ::= <等号演算子>
       |<不等号演算子>
       |<小なり演算子>
       |<大なり演算子>
       |<小なり等号演算子>
       |<大なり等号演算子>
 
!! <論理述語>の形式
<論理述語> ::= <値式> IS TRUE
 
!! <Between述語>の形式
<Between述語> ::= <値式>
         〔 NOT 〕 BETWEEN <値式> AND <値式>
 
!! <In述語>の形式
<In述語> ::= <値式> 〔 NOT 〕 IN <In述語値>
<In述語値> ::= <副問い合わせ>
        |<左括弧> <In項目リスト> <右括弧>
<In項目リスト> ::= <値指定> { <コンマ> <値指定> }...
 
!! <Like述語>の形式
<Like述語> ::= <文字列Like述語>
<文字列Like述語> ::= <値式>
          〔 NOT 〕 <Like種別> <パターン文字列>
          〔 ESCAPE <エスケープ文字> 〕
<Like種別> ::=  LIKE
       |XLIKE
<パターン文字列> ::= <値指定>
<エスケープ文字> ::= <値指定>
 
!! <Null述語>の形式
<Null述語> ::= <値式> IS 〔 NOT 〕 NULL
 
!! <Exists述語>の形式
<Exists述語> ::= EXISTS <副問い合わせ>

(2) <検索条件>

<検索条件>は,<FROM句>のON条件式<結合指定>や,<WHERE句>に指定します。<検索条件>では,複数の<検索条件>の論理演算を指定できます。

形式

<検索条件> ::= <左括弧> <検索条件> <右括弧>
       |<述語>
       |NOT <検索条件>
       |<検索条件> OR <検索条件>
       |<検索条件> AND <検索条件>

<検索条件>についての規則
<検索条件>の論理演算は,次の順序で評価されます。
論理演算の評価順序
  1. 括弧内
  2. NOT
  3. AND
  4. OR
  • 論理演算で指定できるネスト数については,データベースの制限に従います。
  • edmSQLでは,DMAの検索モデルのedmQueryOperator_AndNotオペレータに該当する演算子はありません。指定する場合は,ANDとNOTを組み合わせて指定してください。
  • edmSQLで提供している論理演算子ANDおよびORは,2項演算子です。DMAの検索モデルのオペレータの仕様とは異なりますので,ご注意ください。複数の被演算子を指定したい場合は,演算子を複数組み合わせて指定してください。
    例えば,「a」,「b」,「c」および「d」のAND演算は,「a AND b AND c AND d」または「((a AND b) AND c) AND d」のように表記してください。
論理演算子の詳細
否定演算
演算子:NOT
形式:NOT <検索条件>
否定演算の演算結果を次の表に示します。

表4-39 否定演算の演算結果

NOT演算結果
不定不定
論理和演算
演算子:OR
形式:<検索条件> OR <検索条件>
論理和演算の演算結果を次の表に示します。

表4-40 論理和演算の演算結果

OR不定
不定
不定不定不定
論理積演算
演算子:AND
形式:<検索条件> AND <検索条件>
論理積演算の演算結果を次の表に示します。

表4-41 論理積演算の演算結果

AND不定
不定
不定不定不定

(3) <述語>

<述語>では,edmSQLで提供されている述語の一覧が定義されています。

形式

<述語> ::= <比較述語>
     |<論理述語>
     |<Between述語>
     |<In述語>
     |<Like述語>
     |<Null述語>
     |<Exists述語>

(4) <比較述語>

<比較述語>は,演算子の両辺の比較によって結果を返却します。

形式

<比較述語> ::= <値式> <比較演算子> <比較述語値式>
<比較述語値式> ::= <値式>|<副問い合わせ>
<比較演算子> ::= <等号演算子>|<不等号演算子>|<小なり演算子>
               |<大なり演算子>|<小なり等号演算子>
               |<大なり等号演算子>

<比較述語>の評価
  • 演算子が示す比較演算子が,両辺の被演算子の関係を満たす場合,「真」になります。
  • 演算子の示す比較条件が,両辺の被演算子の関係を満たさない場合,「偽」になります。
  • 指定した被演算子がNULL値の場合,「不定」になります。
  • 指定した被演算子が<副問い合わせ>であり,その検索結果集合が空の場合,「不定」になります。
<比較述語>の規則
  • <比較演算子>の両辺に指定する被演算子には,同じデータ型の値を指定してください。値がNULL値である場合も,同じデータ型にしてください。
  • <比較演算子>によって比較できるのは,データ型がBoolean型,Integer32型,String型およびObject型の値です。ただし,演算子によって使用できるデータ型は異なります。
  • 比較できるデータ型は,データベースによって制限されます。
  • <副問い合わせ>が指定できるのは,<比較演算子>の右辺だけです。
  • <副問い合わせ>を<比較演算子>の被演算子に指定する場合,<副問い合わせ>で指定できる<選択項目>は一つだけです。また,<副問い合わせ>の検索結果として得られる検索件数も,1件または0(空集合)になる必要があります。
  • <FROM句>に指定する<比較述語>には,<副問い合わせ>は指定できません。
  • VariableArray型プロパティを指定する場合は,必ず<フィールド参照>(要素指定の添え字はANY)を指定して,比較できるデータ型のプロパティとして指定してください。また,VariableArray型プロパティのフィールド参照同士の比較はできません。
<比較述語>で使用する演算子の詳細
演算子の詳細を,次の表に示します。

表4-42 <比較述語>で使用できる演算子の詳細

演算子意味比較可能なデータ型
<等号演算子>
(=)
値が等しい場合に「真」になります。
  • Boolean型
  • Integer32型
  • String型
  • Object型
<不等号演算子>
(<>)
値が等しくない場合に「真」になります。
  • Boolean型
  • Integer32型
  • String型
<小なり演算子>
(<)
左辺の値が右辺の値よりも小さい場合に「真」になります。
  • Integer32型
  • String型
<大なり演算子>
(>)
左辺の値が右辺の値よりも大きい場合に「真」になります。
  • Integer32型
  • String型
<小なり等号演算子>
(<=)
左辺の値が右辺の値よりも小さいか,等しい場合に「真」になります。
  • Integer32型
  • String型
<大なり等号演算子>
(>=)
左辺の値が右辺の値よりも大きいか,等しい場合に「真」になります。
  • Integer32型
  • String型

(5) <論理述語>

<論理述語>では,Boolean型の値を評価して結果を返却します。

形式

<論理述語> ::= <値式> IS TRUE

<論理述語>の評価
  • <値式>のBoolean型の値が,真(TRUE)の場合に「真」になります。
  • <値式>のBoolean型の値が,真(TRUE)以外の場合,「偽」になります。
<論理述語>の規則
  • <値式>に指定できるのは,戻り値がBoolean型の<ルーチンの起動>だけです。なお,<論理述語>に指定する<ルーチンの起動>で呼び出せる関数は,HiRDB Text Search Plug-inと連携するための,次の関数だけです。
    contains関数
    contains_with_score関数
    concept_with_score関数
    例えば,WHERE句に,次のように指定できます。

 WHERE contains(edmProp_StIndex, '{"コンピュータ"}') IS TRUE

(6) <Between述語>

形式

<Between述語> ::= <値式>
         〔 NOT 〕 BETWEEN <値式> AND <値式>

<Between述語>の評価
  • 第1の<値式>を「値式1」,第2の<値式>を「値式2」,第3の<値式>を「値式3」とした場合,「値式1」の値が,「値式2」と「値式3」の範囲内の値の場合,「真」になります。範囲外の場合,「偽」になります。
  • 第1の<値式>を「値式1」,第2の<値式>を「値式2」,第3の<値式>を「値式3」とした場合,BETWEEN述語は,次の表記と同じ意味を表します。
    〔NOT〕((値式2 <= 値式1) AND (値式1 <= 値式3))
<Between述語>の規則
「値式2 ≦ 値式3」である必要はありません。

(7) <In述語>

形式

<In述語> ::= <値式> 〔 NOT 〕 IN <In述語値>
<In述語値> ::= <副問い合わせ>
        |<左括弧> <In項目リスト> <右括弧>
<In項目リスト> ::= <値指定> { <コンマ> <値指定> }...

<In述語>の評価
  • 第1の<値式>が,<In述語値>の中の任意の値と一致する場合,<IN述語>は「真」になります。
    NOTを指定した場合は,第1の<値式>が<In述語値>の中の任意の値と一致するとき,「偽」になります。
  • 第1の<値式>が,<In述語値>の中のすべての値と一致しない場合,<IN述語>は「偽」になります。
    NOTを指定した場合は,第1の<値式>が,<In述語値>の中のすべての値と一致しないとき,「真」になります。
<In述語>の規則
  • 第1の<値式>のデータ型と,<In述語値>のデータ型は一致させてください。指定できるデータ型は,Boolean型,Integer32型,String型およびObject型です。
  • データベースによって,指定できるデータ型や,<In項目リスト>に指定できる<値指定>が制限される場合があります。
  • <In項目リスト>を指定する場合は,第1の<値式>に<値指定>は指定できません。
  • <In述語>で<副問い合わせ>の検索結果と比較する場合,<副問い合わせ>で指定できる<選択項目>は一つだけです。
  • <副問い合わせ>の検索結果集合が空集合の場合は,<IN述語>は「偽」になります。
    NOTを指定した場合に,<副問い合わせ>の検索結果集合が空集合のときは,「真」になります。

(8) <Like述語>

形式

<Like述語> ::= <文字列Like述語>
<文字列Like述語> ::= <値式>
          〔 NOT 〕 <Like種別> <パターン文字列>
          〔 ESCAPE <エスケープ文字> 〕
<Like種別> ::= LIKE
       |XLIKE
<パターン文字列> ::= <値指定>
<エスケープ文字> ::= <値指定>

パターンの詳細
<パターン文字列>
  • _:1文字の任意の文字を示します。
  • %:0文字以上の任意の文字数の文字列を示します。
<エスケープ文字>
<エスケープ文字>は,パターン文字列中に「_」や「%」を記述したい場合に指定する文字です。<エスケープ文字>には,任意の1文字を指定します。
<Like述語>の評価
  • <値式>の値が,<パターン文字列>で表すパターンと一致した場合,「真」になります。
    NOTを指定した場合は,<値式>の値が,<パターン文字列>の表すパターンと一致したとき,「偽」になります。
  • <値式>の値が,<パターン文字列>の表すパターンと一致しない場合,「偽」になります。
    NOTを指定した場合,<値式>の値が,<パターン文字列>の表すパターンと一致しないとき,「真」になります。
<Like述語>の規則
  • <値式>に指定できるのは,String型の値だけです。
  • <パターン文字列>に指定できるのは,String型の値だけです。
  • <エスケープ文字>に指定できるのは,String型の値だけです。
  • <Like述語>は,<FROM句>には指定できません。
  • データベースによっては,<値式>,<パターン文字列>,<エスケープ文字>に指定できる値に制限があります。また,処理性能を上げるための指定方法については,データベースの使用方法に従ってください。
  • 指定した文字の認識のされ方は,String型がデータベース上でどの文字列型に対応するかに依存します。
<Like種別>の規則
  • <Like種別>がLIKEの場合,パターン文字列とのパターン一致で,大文字・小文字を区別して評価します。
  • <Like種別>がXLIKEの場合,パターン文字列とのパターン一致で,大文字・小文字を区別しないで評価します。

(9) <Null述語>

形式

<Null述語> ::= <値式> IS 〔 NOT 〕 NULL

<Null述語>の評価
  • <値式>がNULL値の場合に「真」になります。
    NOTを指定した場合は,<値式>がNULL値のとき,「偽」になります。
  • <値式>がNULL値でない場合に「偽」になります。
    NOTを指定した場合は,<値式>がNULL値でないとき,「真」になります。
<Null述語>の規則
  • <値式>に使用できるデータ型は,Boolean型,Integer32型,String型およびObject型(VariableArray型を除く)のプロパティです。ただし,Boolean型のプロパティは,NULL値をとることができません。

データベースによって,指定できるデータ型に制限があります。

(10) <Exists述語>

形式

<Exists述語> ::= EXISTS <副問い合わせ>

<Exists述語>の評価
  • <副問い合わせ>の検索結果が,空集合でなければ「真」になります。
  • <副問い合わせ>の検索結果が,空集合の場合は「偽」になります。
<Exists述語>の規則
  • <副問い合わせ>の検索結果が空集合とは,検索結果の件数が0件であることです。つまり,検索結果の件数が1以上の場合に,<Exists述語>は「真」になります。
  • <Exists述語>の<副問い合わせ>では,SELECT句の<選択項目>には,<アスタリスク>が指定できます。これ以外の<選択項目>に,<アスタリスク>は指定できません。