Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

FOR SOME %ELEMENT

リスト要素の値またはリスト要素の数を述語とマッチングします。

Synopsis

FOR SOME %ELEMENT(field) [[AS] e-alias] (predicate)

引数

field その要素を predicate と比較するスカラ式 (通常はデータ列)。
AS e-alias オプション — predicate 内の %KEY または %VALUE を修飾するために使用する要素のエイリアス。通常、このエイリアスは、入れ子になった FOR SOME %ELEMENT 条件が predicate に含まれる場合に使用します。エイリアスは有効な識別子である必要があります。詳細は、"Caché SQL の使用法" の “識別子” の章を参照してください。AS キーワードはオプションです。
(predicate) 括弧で囲まれた述語条件。この条件内では、条件一致の内容を決定するために、%VALUE または %KEY (あるいはその両方) を使用します。%VALUE は要素値 (%VALUE=’Red’) と一致します。%KEY は要素の最小数 (%KEY=2) と一致します。また、e-alias を指定している場合、この条件でオプションとして %VALUE および %KEY を修飾することができます。この述語は、論理演算子 AND および OR を使用して、複数の条件式で構成することもできます。

説明

FOR SOME %ELEMENT 述語は、指定された predicate 節の値と field のリスト要素をマッチングします。SOME キーワードは、field の要素の少なくとも 1 つが、指定した predicate 節を満たす必要があることを指定します。

predicate 節には、述語条件が続く %VALUE キーワードまたは %KEY キーワードが含まれている必要があります。これらのキーワードは、大文字と小文字を区別しません。

%VALUE および %KEY の使用法を、以下の例で説明しています。

  • (%VALUE=’Red’) は、リスト要素の 1 つとして値 Red が含まれるすべての field 値と一致します。field には、単一の要素 Red のみを含めることも、複数の要素を含めてそのうちの 1 つを Red とすることもできます。

  • (%KEY=2) は、少なくとも 2 つの要素が含まれるすべての field 値と一致します。field には 2 つの要素のみを含めることも、2 つより多い数の要素を含めることもできます。%KEY 値は正の整数値にする必要があります。(%KEY=0) は、どのような field 値とも一致しません。

FOR SOME %ELEMENT は、NULL の field を一致させるために使用することはできません。

predicate 節は、等値条件だけでなく、任意の述語条件を使用できます。以下に predicate 節の例を示します。

(%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)

パフォーマンス上の理由から、述語 LIKE 'abc%' より同等の述語 %STARTSWITH 'abc' を使用することをお勧めします。

AND、OR、および NOT 論理演算子を使用して、複数の述語条件を指定できます。Caché は、結合した述語条件を各要素に適用します。したがって、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 の重要な用途は、コレクション・インデックスを使用して要素を選択することです。適切な KEYS インデックスまたは ELEMENTS インデックスを field に対して定義すると、Caché はフィールド値の要素を直接参照するのではなく、そのインデックスを使用します。

以下のコレクション・インデックスが定義されているとします。

 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 の詳細は、"Caché SQL の使用法" の “データベースの問い合わせ” の章の "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 要素を持つすべての行を返します。

  ZNSPACE "SAMPLES"
  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"

関連項目

FeedbackOpens in a new tab