IN および %INLIST 述語
IN 述語は、構造化されていない一連の項目に値を一致させるために使用されます。
%INLIST 述語は、値をリスト構造の要素に一致させるための InterSystems IRIS の拡張機能です。
どちらの述語を使用しても、等値比較やサブクエリ比較を実行できます。
IN には 2 つの形式があります。1 つ目は、OR 演算子で複数の等値比較を結合する省略表現として使用します。以下はその例です。
SELECT Name, Home_State FROM Sample.Person
GROUP BY Home_State
HAVING Home_State IN ('ME','NH','VT','MA','RI','CT')
上記の文は、Home_State が括弧のリスト内の値と等しい場合、True と評価します。リストの要素は定数または式を指定できます。等式テストと同様に、照合が IN 比較に適用されます。既定では、IN 比較でフィールド定義の照合タイプが使用されます。既定では、文字列フィールドは大文字と小文字が区別されない SQLUPPER として定義されます。
IN 述語の等値比較に日付または時刻を使用すると、適切なデータ型変換が自動的に実行されます。HAVING 節フィールドが TimeStamp 型の場合、Date 型または Time 型の値は Timestamp に変換されます。HAVING 節フィールドが Date 型の場合、TimeStamp 型または String 型の値は Date に変換されます。HAVING 節フィールドが Time 型の場合、TimeStamp 型または String 型の値は Time に変換されます。
以下の 2 つの例は、同じ等値比較を実行し、同じデータを返します。GROUP BY フィールドは、成功した等値比較ごとに 1 つのレコードのみを返すことを指定しています。DOB フィールドは Date データ型です。
SELECT Name,DOB FROM Sample.Person
GROUP BY DOB
HAVING DOB IN ({d '1951-02-02'},{d '1987-02-28'})
SELECT Name,DOB FROM Sample.Person
GROUP BY DOB
HAVING DOB IN ({ts '1951-02-02 02:37:00'},{ts '1987-02-28 16:58:10'})
詳細は、"日付/時刻文" を参照してください。
%INLIST 述語は、リスト構造の要素に対して等値比較を実行するために使用できます。%INLIST は EXACT 照合を使用します。そのため、既定では、%INLIST の文字列比較では大文字と小文字が区別されます。リスト構造の詳細は、SQL の $LIST 関数を参照してください。
以下の例では、%INLIST を使用して、FavoriteColors リスト・フィールドの要素に文字列値を一致させます。
SELECT Name,FavoriteColors FROM Sample.Person
HAVING 'Red' %INLIST FavoriteColors
ここでは、FavoriteColors に “Red” 要素が含まれるすべてのレコードが返されます。
以下の埋め込み SQL の例では、Home_State 列の値を northne (New England 北部の州) リストの要素に一致させます。
SET northne=$LISTBUILD("VT","NH","ME")
&sql(DECLARE StateCursor CURSOR FOR
SELECT Name,Home_State
INTO :name,:state FROM Sample.Person
HAVING Home_State %INLIST :northne)
&sql(OPEN StateCursor)
QUIT:(SQLCODE'=0)
NEW %ROWCOUNT,%ROWID
FOR { &sql(FETCH StateCursor)
QUIT:SQLCODE
WRITE !,"#",%ROWCOUNT," Name=",name," State=",state,!
}
WRITE !,"Final Fetch SQLCODE: ",SQLCODE
&sql(CLOSE StateCursor)
サブクエリで IN または %INLIST を使用し、列の値 (あるいは他の式) がサブクエリの行の値と等しいかどうかをテストできます。以下はその例です。
SELECT Name,Home_State FROM Sample.Person
HAVING Name IN
(SELECT Name FROM Sample.Employee
HAVING Salary < 50000)
サブクエリは、SELECT リスト内に必ず 1 項目を持ちます。
詳細は、このドキュメントのリファレンスの "IN" と "%INLIST" を参照してください。