## 大纲
```
scalar-expression BETWEEN lowval AND highval
```
## 参数
- scalar-expression - 一种标量表达式(最常见的是数据列),将其值与低值和高值(包括高值)之间的值范围进行比较。
- lowval - 解析为低排序规则序列值的表达式,指定与标量表达式中的每个值匹配的值范围的开始。
- highval - 解析为高排序规则序列值的表达式,指定要与标量表达式中的每个值匹配的值范围的末尾。
## 描述
BETWEEN
谓词允许选择lowval
和highval
指定范围内的数据值。
这个范围包括低值和高值本身。
这等价于一对大于或等于操作符和一对小于或等于操作符。
下面的例子展示了这种比较:
```
SELECT Name,Age FROM Sample.Person
WHERE Age BETWEEN 18 AND 21
ORDER BY Age
```
这将返回Sample
中的所有记录。
年龄值介于18
到21
之间的人员表,包括这些值。
注意,必须按升序指定BETWEEN
值;
例如BETWEEN 21 AND 18
这样的谓词将返回空字符串。
如果标量表达式的值都不在指定的范围内,则BETWEEN
返回空字符串。
与大多数谓词一样,BETWEEN
可以使用NOT
逻辑运算符进行反转。
BETWEEN
和NOT BETWEEN
都不能用于返回NULL
字段。
返回NULL
字段使用IS NULL
。
NOT BETWEEN
的示例如下:
```
SELECT Name,Age FROM Sample.Person
WHERE Age NOT BETWEEN 20 AND 55
ORDER BY Age
```
这将返回Sample
中的所有记录。
年龄值小于20
或大于55
的人表,不包括这些值。
## 排序类型
BETWEEN
通常用于按数字顺序排序的数值范围。
但是,BETWEEN
可用于任何数据类型值的排序规则序列范围。
BETWEEN
使用与它所匹配的列相同的排序规则类型。
默认情况下,字符串数据类型排序为SQLUPPER
,这是不区分大小写的。
如果查询为列分配了不同的排序规则类型,则还必须将此排序规则类型应用于BETWEEN
子字符串。
下面的例子说明了这一点:
在下面的示例中,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
```
在下例中,BETWEEN
字符串比较不区分大小写,因为Home_State
字段被定义为SQLUPPER
。
这意味着低val
和高val
在功能上是相同的,在任何字母中选择'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
```
下面的示例显示了在内部连接操作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
或Display
)指定。
这主要适用于日期、时间和 IRIS格式列表(%List
)。
以逻辑格式指定谓词值通常会导致SQLCODE
错误。
例如,SQLCODE -146
“无法将日期输入转换为有效的逻辑日期值”。
在下面的动态SQL示例中,BETWEEN谓词必须以%SelectMode=1
(ODBC)的格式指定日期:
```
ClassMethod Between()
{
s q1 = "SELECT Name,DOB FROM Sample.Person "
s q2 = "WHERE DOB BETWEEN '1950-01-01' AND '1960-01-01'"
s myquery = q1_q2
s tStatement =class(%SQL.Statement).%New()
s tStatement.%SelectMode=1
s qStatus = tStatement.%Prepare(myquery)
if qStatus'=1 {
w "%Prepare failed:"
d $System.Status.DisplayError(qStatus)
q
}
s rset = tStatement.%Execute()
d rset.%Display()
w !,"End of data"
}
```
```
DHC-APP>dclass(PHA.TEST.SQLCommand).Between()
Name DOB
Houseman,Martin D. 1955-09-25
Ingrahm,Yan S. 1954-06-15
Smith,Elvis Y. 1955-06-29
Gore,Alfred M. 1958-09-15
Yoders,Liza U. 1959-06-05
Ng,Liza Z. 1955-10-05
Yeats,Debby G. 1951-12-06
Zweifelhofer,Zelda J. 1954-02-19
Solomon,Emily D. 1953-01-28
Isaacs,Elvis V. 1952-04-05
Pantaleo,Robert U. 1950-03-29
Zampitello,Josephine Q. 1953-08-14
Xiang,Molly F. 1953-03-21
Nichols,Heloisa M. 1957-07-19
Hertz,Uma C. 1954-07-25
LaRocca,David X. 1956-01-11
Houseman,Alice R. 1957-12-07
Alton,Phil T. 1953-02-25
Davis,Jane E. 1953-07-28
Vanzetti,Alexandra O. 1953-12-29
Uhles,Dmitry P. 1951-08-23
Jafari,Christine Z. 1950-04-11
22 Rows(s) Affected
End of data
```