(%VALUE='Red')
(%VALUE > 21)
(%VALUE %STARTSWITH 'R')
(%VALUE [ 'e')
(%VALUE IN ('Red','Blue')
(%VALUE IS NOT NULL)
(%KEY=3)
(%KEY > 1)
(%KEY IS NOT NULL)
Note:
実行時に述語の値を指定した場合 (? 入力パラメータまたは :var 入力ホスト変数を使用)、その結果の述語 %STARTSWITH 'abc' は、同等の結果の述語 LIKE 'abc%' よりもパフォーマンスが優れています。
AND、OR、および NOT 論理演算子を使用して、複数の述語条件を指定できます。InterSystems IRIS は、結合した述語条件を各要素に適用します。したがって、2 つの %VALUE 述語または 2 つの %KEY 述語を AND テストを使用して適用することには意味がありません。
例えば、FOR SOME %ELEMENT を使用して、値 Red、Green、Red Green、Black Red、Green Yellow Red、Green Black、Yellow、または Black Yellow が含まれているフィールドを一致させます。
-
(%VALUE='Red') は、Red の要素を含むすべてのフィールド (Red、Red Green、Black Red、および Red Yellow Green) と一致します。
-
(%VALUE='Red' OR %VALUE='Green') は、Red と Green のいずれか (または順序を問わずその両方) の要素を含むフィールド (Red、Green、Red Green、Black Red、Green Yellow Red、Green Black) と一致します。この機能は、(%VALUE IN('Red','Green')) と同じです。
-
(%VALUE='Red' AND %VALUE='Green') は、どのフィールド値とも一致しません。各要素で Red と Green の両方について一致を確認しますが、値 Red と値 Green の両方を持つことができる要素がないためです。この述語は、2 要素の値 Red Green とは一致しません。
-
(%VALUE='Red' AND %KEY=2) は、Red Green、Black Red、Green Yellow Red と一致します。
-
(%VALUE='Red' OR %KEY=2) は、Red、Red Green、Black Red、Green Yellow Red、Green Black、Black Yellow と一致します。
FOR SOME %ELEMENT はコレクション述語です。これは、述語条件を指定できるコンテキストのほとんどで使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。これは以下の制限に従います。
-
FOR SOME %ELEMENT は、HAVING 節では使用できません。
-
FOR SOME %ELEMENT は、JOIN 操作用のフィールドを選択する述語として使用することはできません。
-
OR 論理演算子を使用して FOR SOME %ELEMENT を別の述語条件に関連付けることは、2 つの述語が異なるテーブル内のフィールドを参照している場合はできません。例えば、以下のような場合です。
WHERE FOR SOME %ELEMENT(t1.FavoriteColors) (%VALUE='purple') OR t2.Age < 65
この制限はオプティマイザがインデックスを使用する方法に依存するので、SQL はこの制限を、インデックスがテーブルに追加されるときにのみ適用できます。このタイプの論理は、すべてのクエリで使用しないことを強くお勧めします。
-
シャード・テーブルに対してクエリを実行するときに FOR SOME %ELEMENT を使用することはできません。"スケーラビリティ・ガイド" の “シャーディングによるデータ量に応じた InterSystems IRIS の水平方向の拡張” の章にある "シャード・クラスタにおけるクエリ" を参照してください。
コレクション・インデックス
FOR SOME %ELEMENT の重要な用途は、コレクション・インデックスを使用して要素を選択することです。適切な KEYS インデックスまたは ELEMENTS インデックスを field に対して定義すると、InterSystems IRIS はフィールド値の要素を直接参照するのではなく、そのインデックスを使用します。
以下のコレクション・インデックスが定義されているとします。
INDEX fcIDX1 ON FavoriteColors(ELEMENTS);
以下のクエリは上記のインデックスを使用します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE='Red')
以下のコレクション・インデックスが定義されているとします。
INDEX fcIDX2 ON FavoriteColors(KEYS) [ Type = bitmap ];
以下のクエリは上記のインデックスを使用します。
SELECT Name,FavoriteColors FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors) (%KEY=2)
コレクション・インデックスを使用する FOR SOME %ELEMENT の詳細は、"InterSystems SQL の使用法" の “データベースの問い合わせ” の章の "コレクションのクエリ" を参照してください。
例
以下の例は、FOR SOME %ELEMENT を使用して、FavoriteColors のリストに 'Red' 要素が含まれる行を返します。
SELECT Name,FavoriteColors
FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE='Red')
以下の例では、述語 %VALUE にはコンマ区切りリストを指定する IN 文が含まれます。この例は、FavoriteColors のリストに要素 'Red' または要素 'Blue' (または両方) が含まれる行を返します。
SELECT Name,FavoriteColors
FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE IN ('Red','Blue'))
以下の例は、2 つの包含関係演算子 ([) と共に述語節を使用しています。これは、FavoriteColors のリストに小文字 'l' と小文字 'e' (包含関係演算子は大文字と小文字が区別されます) を含む要素がある行を返します。この場合、要素は 'Blue' や 'Yellow'、'Purple' があります。
SELECT Name,FavoriteColors AS Preferences
FROM Sample.Person
WHERE FOR SOME %ELEMENT(FavoriteColors) AS fc (fc.%VALUE [ 'l' AND fc.%VALUE [ 'e')
この例では、要素のエイリアス (e-alias) の使用方法についても示しています。
以下のダイナミック SQL の例では、%KEY を使用して、FavoriteColors 内の要素の数に基づいて行が返されます。最初の %Execute() は %KEY=1 を設定し、1 つ以上の FavoriteColors 要素を持つすべての行を返します。2 番目の %Execute() は %KEY=2 を設定し、2 つ以上の FavoriteColors 要素を持つすべての行を返します。
SET q1 = "SELECT %ID,Name,FavoriteColors FROM Sample.Person "
SET q2 = "WHERE FOR SOME %ELEMENT(FavoriteColors) (%KEY=?)"
SET myquery = q1_q2
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=1
SET qStatus = tStatement.%Prepare(myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute(1)
DO rset.%Display()
WRITE !,"End of data %KEY 1",!!
SET rset = tStatement.%Execute(2)
DO rset.%Display()
WRITE !,"End of data %KEY 2"
関連項目