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?

BETWEEN

値を値の範囲とマッチングします。

Synopsis

scalar-expression BETWEEN lowval AND highval

引数

scalar-expression その値を lowvalhighval の間 (包含的) の値の範囲と比較するスカラ式 (通常はデータ列)。
lowval scalar-expression の各値とマッチングする値の範囲の先頭を指定する、照合順の最小値に解決される式。
highval scalar-expression の各値とマッチングする値の範囲の末尾を指定する、照合順の最大値に解決される式。

説明

BETWEEN 述語では、lowvalhighval で指定された範囲内にあるデータ値を選択できます。この範囲には、lowval 値と highval 値も含まれます。これは、「以上」演算子と「以下」演算子の組み合わせと同じ働きをします。この比較は、以下の例を参照してください。

SELECT Name,Age FROM Sample.Person
WHERE Age BETWEEN 18 AND 21
ORDER BY Age

これにより、Sample.Person テーブルの Age 値が 18 ~ 21 の範囲にあるすべてのレコードを返します。BETWEEN 値は昇順で指定する必要があることに注意してください。BETWEEN 21 AND 18 のような述語は、NULL 文字列を返します。スカラ式のいずれの値も指定された範囲に入らない場合、BETWEEN は NULL 文字列を返します。

ほとんどの述語と同様に、BETWEEN は NOT 論理演算子を使用して反転できます。BETWEENNOT BETWEEN も、NULL フィールドを返すために使用することはできません。NULL フィールドを返すには、IS NULL を使用します。以下の例では、NOT BETWEEN を示します。

SELECT Name,Age FROM Sample.Person
WHERE Age NOT BETWEEN 20 AND 55
ORDER BY Age

これにより、Sample.Person テーブルの Age 値が 20 より 小さく 55 より大きいすべてのレコードを返します。

述語条件を指定できる場所であればどこでも、BETWEEN を使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。

照合タイプ

BETWEEN は通常、数値順に照合を行う数値の範囲に使用します。ただし、BETWEEN は、任意のデータ型の値の照合順範囲に使用できます。

BETWEEN はマッチングの対象となる列と同じ照合タイプを使用します。既定では、文字列データ型は大文字と小文字が区別されない SQLUPPER として照合されます。現在のネームスペースにおける既定の文字列の照合の定義およびフィールド/プロパティの定義における既定以外のフィールドの照合タイプの指定の詳細は、"Caché 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 文字列比較では大文字と小文字が区別されません。つまり、lowvalhighval は、機能的には同じになり、大文字小文字に関係なく '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 %STRING('OA') AND %STRING('OZ')
ORDER BY Name

この例では、%STRING を使用して、Odem、O'Donnell、および Olsen を選択できます。%STRING 照合タイプを指定しないと、O'Donnell は選択されません。

ケース変換関数の詳細は、"%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 または表示) で指定する必要があります。このことは主に、日付、時刻、および Caché 形式のリスト (%List) に当てはまります。論理形式で述語値 (1 つまたは複数) を指定すると、一般に、SQLCODE エラーが発生します。例えば、SQLCODE -146 “[入力された日付を妥当な日付論理値に変換できません]” が返されます。

以下のダイナミック SQL の例の BETWEEN 述語では、%SelectMode=1 (ODBC) 形式で日付を指定する必要があります。

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

関連項目

FeedbackOpens in a new tab