操作符
逻辑操作符
通常用到的逻辑操作符是:AND,OR,NOT。
SQL 语言使用 3 个布尔类型逻辑值,其中空值代表“未知”,具体请看下面的真值表。
AND/OR 真值表:
a | B | a AND b | a OR b |
---|---|---|---|
真 | 真 | 真 | 真 |
真 | 假 | 假 | 真 |
真 | 空值 | 空值 | 真 |
假 | 假 | 假 | 假 |
假 | 空值 | 假 | 空值 |
空值 | 空值 | 空值 | 空值 |
NOT 真值表:
a | NOT a |
---|---|
真 | 假 |
假 | 真 |
空值 | 空值 |
操作符 AND 和 OR 是可交换的,这就是说,可以交换操作符左边和右边的操作数,而不会影响最后的操作结果。
比较操作符
下面表中显示了通常使用的比较操作符:
操作符 | 描述 |
---|---|
< | 小于号 |
> | 大于号 |
<= | 小于等于号 |
>= | 大于等于号 |
= | 等于号 |
<> | 不等号 |
!= | 不等号 |
对于所有实际使用的数据类型来说,都可以使用比较操作符。所有比较操作符都是二元操作符,用于返回布尔类型的值;像 1<2<3 这样的表达式是无效的(因为这里小于操作符不能在数值 3 和一个布尔类型值之间进行比较)。
除了比较操作符外,也可以使用 BETWEEN 操作符,如下所示:
a BETWEEN x AND y
它等同于
a >= x AND a <= y
类似地,
a NOT BETWEEN x AND y
等同于
a < x OR a > y
除了在 CPU 运算的时候需要把第一形式的表达式重写成第二种外,这两种形式的表达式没有任何区别。
为检查一个值是否为空,可以使用下列形式的表达式:
expression IS NULL
expression IS NOT NULL
不要使用像 expression = NULL 这样的表达式。因为 NULL 不等于空值(空值代表不确定的值,所以不能确定两个不确定的值是否相等)。这个行为符合 SQL 标准。
如果表达式计算值为空,那么一些程序可能期望 expression = NULL 的返回值为真。而在这里强烈推荐修改程序来符合 SQL 标准。
数学操作符
系统提供了数学操作符对 AntDB 所支持数据类型的值进行操作。而在后面的章节中将介绍对那些没有通用数学约定的类型进行数值改变操作(例如,日期/时间类型)的实际动作。
下面的表显示了允许使用的数学操作符:
操作符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | 2 + 3 | 5 |
- | 减法 | 2 – 3 | -1 |
* | 乘法 | 2 * 3 | 6 |
/ | 除法(使用整除来截断最后结果) | 4 / 2 | 2 |
串联操作符
操作符 | 描述 | 示例 |
---|---|---|
string || string | 字符串连接 | select 'Ant'||'DB' from dual; |
日期时间操作符
下表说明了基本算术操作符(+,-)的功能。在进行本节的内容学习前,应该从章节 2.2.4 中熟悉了日期/时间类型的背景信息。
操作符 | 示例 | 结果 |
---|---|---|
+ | DATE '2001-09-28' + 7 | 2001-10-05 00:00:00 |
+ | TIMESTAMP '2001-09-28 13:30:00' + 3 | 2001-10-01 13:30:00 |
- | DATE '2001-10-01' - 7 | 2001-09-24 00:00:00 |
- | TIMESTAMP '2001-09-28 13:30:00' - 3 | 2001-09-25 13:30:00 |
- | TIMESTAMP '2001-09-29 03:00:00' - TIMESTAMP '2001-09-27 12:00:00' | 1 day 15:00:00 |
使用 LIKE 操作符进行模式匹配
AntDB 提供的模式匹配功能是通过使用传统的 LIKE 操作符来实现的。LIKE 操作符的使用语法如下所示:
string LIKE pattern [ ESCAPE escape-character ]
string NOT LIKE pattern [ ESCAPE escape-character ]
每个参数 pattern 都定义了一个字符串集,如果参数 pattern 定义的字符串集中包含参数 string 的值,那么 LIKE 表达式返回 true。正如所期望的,如果 LIKE 表达式返回为真,那么 NOT LIKE 表达式返回为假,反之亦然。与 NOT LIKE 相等的表达式是 NOT (string LIKE pattern)。
如果参数 pattern 不包括百分号或者下划线,那么模式只表示字符串本身,在这种情况下,LIKE 操作符和等于号的作用相同。在参数pattern 中的下划线表示匹配单个字符,而百分号则表示匹配任意字符串。
示例:
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_' true
'abc' LIKE 'c' false
LIKE 模式匹配覆盖整个字符串,如果想从字符串中任意位置开始匹配,那么模式必须以百分号开始,以百分号结束。
如果只想匹配字符串中的下划线或者百分号,那么在模式中,必须通过使用换码符对这两个字符分别进行处理。缺省的换码符是反斜线,但是也可以通过使用 ESCAPE 子句来选择一个不同的换码符。如果想匹配换码符本身,那么就需要写上两个换码符。
需要注意的是在字符串中,反斜线已经有了特定含义,所以当匹配模式中包含一个反斜线的时候,在 SQL 语句中实际上要写上 2 个反斜线。因此,书写一个包含以文字方式出现的反斜线意味着必须在语句中写上 4 个反斜线。而通过使用 ESCAPE 子句来选择不同的换码符,就可以避免这种情况的发生;这样反斜线对于 LIKE 操作符来说就没有特定的含义了(但是对于字符串分析器来说,它仍然具有特定含义,所以需要在字符串中写 2 个反斜线)。
也可以通过使用 ESCAPE 来不选择换码符。这样可以有效地禁用换码符机制,使其不可能关闭匹配模式中的下划线和百分号的特定含义。
示例:
SELECT 'ab\c' LIKE 'ab\\\c' FROM dual;
SELECT 'ab\c' LIKE 'abx\c' ESCAPE 'x' FROM dual;