6.17.5 WHERE節
(1) WHERE節で使用できる条件式
WHERE節で使用できる条件式を次の表に示します。
表6-21 WHERE節で使用できる条件式
式 | 内容 | BNF構文の構文名※ |
---|
BETWEEN | フィールドで指定した範囲に含まれていることを評価します。 | between_expression |
IN | フィールドで指定したどれかの値と一致することを評価します。 | in_expression |
LIKE | フィールドでワイルドカード記号を展開したあとの文字列と一致することを評価します。 | like_expression |
IS [NOT] NULL | null値かどうかをテストします。 | null_comparison_expression |
IS [NOT] EMPTY | 指定したコレクション値が空かどうかをテストします。 | empty_collection_comparison_expression |
[NOT] MEMBER [OF] | 指定したコレクション値がコレクションのメンバであるかどうかをテストします。空のコレクションを表す場合,MEMBER OF式の値はFALSE,NOT MEMBER OF式の値はTRUEとなります。 | collection_member_expression |
EXISTS | サブクエリの結果を判定します。一つ以上の値がある場合はtrue,それ以外はfalseを返します。 | exists_expression |
ALL | サブクエリで返されたすべての値と比較します。 | all_or_any_expression |
ANY (SOME) | サブクエリで返されたどれかの値と比較します。 | all_or_any_expression |
サブクエリ | selectによる結果を記述できます。 | subquery |
関数式 | 「(2) 関数式」を参照してください。 | 該当する関数構文を参照 |
注※ BNF構文の構文名の詳細については,「付録D JPQLのBNF」を参照してください。
WHERE節を使用する場合の注意事項について説明します。
- IN式
- 評価対象のフィールドがnull値かunknownの場合,式の値はunknownになります。
- IN式に対する値の集合を定義したコンマで区切られたリストでは,少なくとも一つ以上の要素が必要です。Cosminexus JPAプロバイダの場合,一つ以上の要素がないと例外が発生します。
- 評価対象のフィールドは,文字列,数値,またはenum値を持つ必要があります。
- リテラルや入力パラメタ値,およびサブクエリの結果は,評価対象のフィールドと同じ抽象スキーマ型にしてください。Cosminexus JPAプロバイダの場合,同じ抽象スキーマ型でないと例外が発生します。
- LIKE式
- BNF構文で示されるstring_expressionまたはpattern_valueの値が,nullまたはunknownの場合,LIKE式の値はunknownになります。
- BNF構文で示されるescape_characterが指定されている場合で,値がnullのとき,LIKE式の値はunknownになります。
- 指定するパターン値は,アンダースコア(_)が1文字に相当し,パーセント(%)文字が連続文字(空の連続文字も含む)に相当します。なお,ほかの文字は検索文字列を示します。
- オプションのエスケープ文字は,文字列リテラルかまたはcharacter文字です。パターン文字列のアンダースコアとパーセント文字を標準の文字として解釈させる場合に使用します。
- IS [NOT] NULL式
指定したコレクション値がnullまたはunknownの場合,IS [NOT] EMPTY式の値はunknownになります。
- [NOT] MEMBER [OF]式
指定した値がnullまたはunknownの場合,戻り値はunknownになります。
- ALL式またはANY (SOME)式
- 条件演算がtrueでもfalseでもない場合は,unknownになります。
- 一緒に使用できる比較演算子は,=,<,<=,>,>=,<>です。
- サブクエリの結果の型は比較演算子の型と同じにする必要があります。Cosminexus JPAプロバイダの場合,型が異なると例外が発生します。
- SOMEは,ANYの同義語です。※
注※ この注意事項はANY (SOME)式の場合だけ該当します。
- サブクエリ
WHERE節やHAVING節で使用します。FROM節では使用できません。
(2) 関数式
JPQLでは次の表に示す関数をWHERE節やHAVING節で使用できます。関数式の引数の値がnullかunknownの場合,関数式の値はunknownになります。
表6-22 JPQLで使用できる関数
分類 | 関数 | 返り値 | 引数についての補足説明 |
---|
文字列関数 | CONCAT | 引数の連結した文字列 | - |
SUBSTRING | 引数で指定した開始位置と長さの文字列 | 2番目と3番目引数は,返されるサブストリングの開始位置および長さを整数で指定します。文字列の先頭の位置は1です。 |
TRIM | 特定の文字を取り除いた文字列 | 取り除く文字がない場合は,スペース(空白)と見なされます。任意のtrim文字はcharacterの入力文字列です。トリムの方法が指定されない場合はBOTHとなります。 |
LOWER | 小文字化した文字列 | - |
UPPER | 大文字化した文字列 | - |
LENGTH | 文字列長の整数値 | - |
LOCATE | 指定された位置から検索し,与えられた文字列で最初に文字列を見つけた位置の整数値 (文字列が見つからない場合は0) | 1番目引数は検索する文字列,2番目引数は検索される文字列を示します。任意となる3番目の引数は,検索を開始する文字の位置を示します(デフォルトは先頭から検索)。文字列の先頭位置は1です。 |
算術関数 | ABS | 関数の引数と同じ型(Integer,Float,またはDouble)の絶対値 | 引数として数値を渡します。 |
SQRT | 引数で渡された数値の平方根(実数) | 引数として数値を渡します。 |
MOD | 引数で渡された二つの数値の剰余(整数) | 二つの整数を渡します。 |
SIZE | コレクションの要素数(整数) | コレクションを渡します。 |
日付時間関数 | CURRENT_DATE | データベースの日付 | - |
CURRENT_TIME | データベースの時刻 | - |
CURRENT_TIMESTAMP | データベースのタイムスタンプ | - |
(凡例)-:該当しない
(3) 注意事項
WHERE節の注意事項について説明します。
(a) 演算子の優先順位
演算子の優先順位を次に示します。
- ピリオド(.)
- 算術演算子
単項演算(+,-),乗算と除算(*,/),加算と減算(+,-)
- 比較演算子
=,>,>=,<,<=,<>(not equal),[NOT] BETWEEN,[NOT] LIKE,[NOT] IN,IS [NOT] NULL,IS [NOT] EMPTY,[NOT] MEMBER [OF]
- 論理演算子
NOT,AND,OR
(b) 条件式の注意事項
- 条件式は,条件式,比較式,論理演算子,評価結果がboolean値になるパス式,booleanリテラル,boolean型の入力パラメタで構成されます。
- 算術式は,比較式で使用できます。算術式は,ほかの算術式,四則演算,結果が数値になるパス式,数値リテラル,数値型の入力パラメタで構成されます。
- 算術操作は,数値昇格(numeric promotion)を使用します。
- 式の評価順序を示すために括弧で囲むことができます。
- 集合関数は,HAVING節の条件式だけで使用できます。
- 条件式の中では,シリアライズ形式またはlobsとしてマップされるフィールドを使用しないでください。
(c) リテラルの注意事項
- 文字リテラルは,シングルクォテーションで囲みます(例:'literal')。シングルクォテーションを含む文字列リテラルは,二つシングルクォテーションを使用します。
- JavaStringリテラルのように,クエリの文字列リテラルはUnicode文字のエンコードを使用します。
- Javaのエスケープ表記の使用は,クエリの文字列リテラルではサポートしません。
- enumのリテラルは,Javaのenumリテラル構文のリテラルが使用できます。enumリテラルにはenumクラス名が必要です。
- booleanリテラルは,TRUEとFALSEである。このリテラルは大文字小文字を区別しません。
(d) 識別変数の注意事項
- 識別変数は,クエリのFROM節で宣言された識別子であるため,ほかの節では宣言できません。FROM節以外で宣言した場合は例外が発生します。SELECT文,またはDELETE文のWHEREかHAVING節で使用されるすべての識別変数は,FROM節で定義されたものを使用します。
- 識別変数の範囲は,WHERE節とHAVING節で決定されます。識別変数は,エンティティの抽象スキーマタイプのコレクションメンバやインスタンスは指定できますが,コレクション自体は指定できません。コレクションを指定した場合は例外が発生します。
(e) Path式の注意事項
WHEREかHAVING節内でのコレクションのパス式で,条件式の一部としてIS [NOT] EMPTY式や[NOT] MEMBER [OF]式,またはSIZE操作への引数以外を使用しないでください。
(f) 入力パラメタの注意事項
- 入力パラメタは,クエリのWHERE節かHAVING節で使用できます。
- 一つのクエリで位置パラメタと名前付きパラメタを混在して使用しないでください。混在した場合の動作は保証されません。
- 入力パラメタの値がnullの場合,入力パラメタを含む比較操作か算術操作で返される値はunknownになります。
なお,位置パラメタと名前付きパラメタの使い方については,「6.16.1(2) パラメタの指定方法」を参照してください。