照合タイプ
BETWEEN は通常、数値順に照合を行う数値の範囲に使用します。ただし、BETWEEN は、任意のデータ型の値の照合順範囲に使用できます。
BETWEEN はマッチングの対象となる列と同じ照合タイプを使用します。既定では、文字列データ型は大文字と小文字が区別されない SQLUPPER として照合されます。現在のネームスペースにおける既定の文字列の照合の定義およびフィールド/プロパティの定義における既定以外のフィールドの照合タイプの指定の詳細は、"InterSystems SQLの使用法" の “照合” の章を参照してください。
クエリで列に別の照合タイプが割り当てられている場合、その照合タイプを BETWEEN substring にも適用する必要があります。詳細は、以下の例を参照してください。
以下の例では、BETWEEN はフィールドの既定である、大文字と小文字を区別しない照合 (SQLUPPER) を使用します。Name がアルファベット順で Home_State よりも大きく、Home_State がアルファベット順で Home_City よりも大きなレコードを返します。
SELECT Name,Home_State,Home_City
FROM Sample.Person
WHERE Home_State BETWEEN Name AND Home_City
ORDER BY Home_State
Home_State フィールドが SQLUPPER として定義されているため、以下の例の BETWEEN 文字列比較では大文字と小文字が区別されません。つまり、lowval と highval は、機能的には同じになり、大文字小文字に関係なく 'MA' を選択します。
SELECT Name,Home_State FROM Sample.Person
WHERE Home_State
BETWEEN 'MA' AND 'Ma'
ORDER BY Home_State
以下の例では、%SQLSTRING 照合関数により、BETWEEN 文字列比較は大文字と小文字を区別します。Home_State が 'MA' から 'Ma' の値のレコードが選択されます。このデータ・セットには、'MA'、'MD'、'ME'、'MO'、'MS'、および 'MT' が含まれます。
SELECT Name,Home_State FROM Sample.Person
WHERE %SQLSTRING(Home_State)
BETWEEN %SQLSTRING('MA') AND %SQLSTRING('Ma')
ORDER BY Home_State
以下の例では、BETWEEN 文字列比較は、大文字と小文字を区別せず、スペースと句読点を無視します。
SELECT Name FROM Sample.Person
WHERE %STRING(Name) BETWEEN %SQLSTRING('OA') AND %SQLSTRING('OZ')
ORDER BY Name
ケース変換関数の詳細は、"%SQLUPPER" を参照してください。
以下の例では、INNER JOIN 操作の ON 節で使用されている BETWEEN を示しています。これは、大文字と小文字が区別されない文字列比較を実行しています。
SELECT P.Name AS PersonName,E.Name AS EmpName
FROM Sample.Person AS P INNER JOIN Sample.Employee AS E
ON P.Name BETWEEN 'an' AND 'ch' AND P.Name=E.Name
%SelectMode
論理形式ではない値に %SelectMode が設定されている場合は、BETWEEN 述語値を %SelectMode 形式 (ODBC または表示) で指定する必要があります。このことは主に、日付、時刻、および InterSystems IRIS 形式のリスト (%List) に当てはまります。論理形式で述語値 (1 つまたは複数) を指定すると、一般に、SQLCODE エラーが発生します。例えば、SQLCODE -146 “[入力された日付を妥当な日付論理値に変換できません]” が返されます。
以下のダイナミック SQL の例の BETWEEN 述語では、%SelectMode=1 (ODBC) 形式で日付を指定する必要があります。
SET q1 = "SELECT Name,DOB FROM Sample.Person "
SET q2 = "WHERE DOB BETWEEN '1950-01-01' AND '1960-01-01'"
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()
DO rset.%Display()
WRITE !,"End of data"