#比较运算符
YashanDB提供如下比较运算符:
运算符 | 操作数 | 含义 | NULL参与运算 |
---|---|---|---|
= | 二元 | 等于 | 结果为FALSE |
!= 或 <> | 二元 | 不等于 | 结果为FALSE |
> | 二元 | 大于 | 结果为FALSE |
>= | 二元 | 大于等于 | 结果为FALSE |
< | 二元 | 小于 | 结果为FALSE |
<= | 二元 | 小于等于 | 结果为FALSE |
[NOT] IN | 二元 | 左边数据是否[不]在右边数据集合中 | IN: * 左边数据为NULL:结果为FALSE * 右边集合包含NULL:如果集合中有非NULL值与左边数据相等,则结果为TRUE,否则为FALSE NOT IN: * 左边数据为NULL:结果为FALSE * 右边集合包含NULL:如果集合中含有NULL值,则返回FALSE;如果集合中不含NULL值,且所有数据与左边数据不相等,则结果为TRUE,否则为FALSE |
[NOT] LIKE | 二元 | 左边数据是否与右边数据[不]匹配 | 结果为FALSE |
[NOT] BETWEEN AND | 三元 | 第一个数据是否[不]在第二个数据和第三个数据组成的区间内 | 结果为FALSE |
IS [NOT] NULL | 一元 | 是否[不]等于NULL | IS NULL: * 操作数为NULL:结果为TRUE * 操作数不为NULL:结果为FALSE IS NOT NULL: * 操作数为NULL:结果为FALSE * 操作数不为NULL:结果为TRUE |
比较运算符在SQL语法中的详细运用请参考condition条件子句描述。
# 运算优先级
从高到低的运算优先级为:
- =、!= 或 <>、>、>=、<、<=
- [NOT] IN、IS [NOT] NULL、[NOT] LIKE
- [NOT] BETWEEN AND
可以使用双括号()来调整想达到的运算优先级。
# 数据类型
在执行=、!= 或 <>、>、>=、<、<=比较符运算时,如下数据类型可能会参与到比较运算中:
- 数值型
- 字符型
- 日期时间型
- 布尔型
- RAW
# 类型转换
如果比较符两边的数据类型不一致,YashanDB将通过隐式数据转换,将其中一边的数据类型向另一边统一,统一原则为:
- 数值型最小提升规则:按TINYINT->SMALLINT->INT->BIGINT->NUMBER->FLOAT->DOUBLE顺序向后统一。
- BIT型数据与BIGINT、NUMBER型数据进行运算时,将会向BIGINT/NUMBER型统一。
- 字符型数据与其他类型进行运算时,将会向其他类型统一。
- DATE型数据与TIMESTAMP型数据进行运算时,将会向TIMESTAMP型统一。
- TIME型数据与DS_INTERVAL型数据进行运算时,将会向DS_INTERVAL型统一。
- 布尔型数据与数值型数据进行运算时,将会向数值型统一。
# (1)数值型与布尔型统一规则
行列标题格为参与=、!= 或 <>、>、>=、<、<=比较符运算的数据类型;内容单元格为统一后的数据类型;–表示不支持两种数据类型参与比较运算。
数据类型 | TINYINT | SMALLINT | INT | BIGINT | BIT | NUMBER | FLOAT | DOUBLE | BOOLEAN |
---|---|---|---|---|---|---|---|---|---|
TINYINT | TINYINT | SMALLINT | INT | BIGINT | BIGINT | NUMBER | FLOAT | DOUBLE | TINYINT |
SMALLINT | SMALLINT | SMALLINT | INT | BIGINT | BIGINT | NUMBER | FLOAT | DOUBLE | SMALLINT |
INT | INT | INT | INT | BIGINT | BIGINT | NUMBER | FLOAT | DOUBLE | INT |
BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | NUMBER | FLOAT | DOUBLE | BIGINT |
BIT | BIGINT | BIGINT | BIGINT | BIGINT | BIT | NUMBER | -- | -- | BIGINT |
NUMBER | NUMBER | NUMBER | NUMBER | NUMBER | NUMBER | NUMBER | FLOAT | DOUBLE | -- |
FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | -- | FLOAT | FLOAT | DOUBLE | -- |
DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | -- | DOUBLE | DOUBLE | DOUBLE | -- |
BOOLEAN | TINYINT | SMALLINT | INT | BIGINT | BIGINT | -- | -- | -- | BOOLEAN |
# (2)数值型、布尔型与字符型统一规则
行列标题格为参与=、!= 或 <>、>、>=、<、<=比较符运算的数据类型;内容单元格为统一后的数据类型,其中(1)表示采用上面(1)数值型与布尔型统一规则;–表示不支持两种数据类型参与比较运算。
数据类型 | 整型数值 | BIT | NUMBER | FLOAT | DOUBLE | BOOLEAN | 字符型 |
---|---|---|---|---|---|---|---|
整型数值 | (1) | (1) | (1) | (1) | (1) | (1) | NUMEBR |
BIT | (1) | (1) | (1) | (1) | (1) | (1) | BIT |
NUMBER | (1) | (1) | (1) | (1) | (1) | (1) | NUMEBR |
FLOAT | (1) | (1) | (1) | (1) | (1) | (1) | FLOAT |
DOUBLE | (1) | (1) | (1) | (1) | (1) | (1) | DOUBLE |
BOOLEAN | (1) | (1) | (1) | (1) | (1) | (1) | BOOLEAN |
字符型 | NUMEBR | BIT | NUMEBR | FLOAT | DOUBLE | BOOLEAN | 字符型* |
Note:
字符型与字符型的比较,执行的是大小写敏感的字符串比较,详细描述请参考字符型文档。
# (3)数值型、布尔型、字符型与日期时间型统一规则
行列标题格为参与=、!= 或 <>、>、>=、<、<=比较符运算的数据类型;内容单元格为统一后的数据类型,其中(2)表示采用上面(2)数值型、布尔型与字符型统一规则;–表示不支持两种数据类型参与比较运算。
数据 类型 | 数值型 | 字符型 | BOOLEAN | DATE | TIMESTAMP | YM_ INTERVAL | DS_ INTERVAL | TIME |
---|---|---|---|---|---|---|---|---|
数值型 | (2) | (2) | (2) | -- | -- | -- | -- | -- |
字符型 | (2) | (2) | (2) | DATE | TIMESTAMP | YM_ INTERVAL | DS_ INTERVAL | TIME |
BOOLEAN | (2) | (2) | (2) | -- | -- | -- | -- | -- |
DATE | -- | DATE | -- | DATE | TIMESTAMP | -- | -- | -- |
TIMESTAMP | -- | TIMESTAMP | -- | TIMESTAMP | TIMESTAMP | -- | -- | -- |
YM_ INTERVAL | -- | YM_ INTERVAL | -- | -- | -- | YM_ INTERVAL | -- | -- |
DS_ INTERVAL | -- | DS_ INTERVAL | -- | -- | -- | -- | DS_ INTERVAL | DS_ INTERVAL |
TIME | -- | TIME | -- | -- | -- | -- | DS_ INTERVAL | TIME |
示例
--NULL参与比较
SELECT SYSDATE FROM DUAL WHERE NULL IN (1,NULL);
SYSDATE
--------------------------------
SELECT SYSDATE FROM DUAL WHERE 1 IN (1,NULL);
SYSDATE
--------------------------------
2021-06-08 10:05:53
SELECT SYSDATE FROM DUAL WHERE 1 IN (2,NULL);
SYSDATE
--------------------------------
--字符型与数值型比较时的隐式转换
SELECT 1 FROM dual
WHERE '0'<4;
1
------------
1
--布尔型与字符型比较时的隐式转换
SELECT 1 FROM dual
WHERE true LIKE 'true%';
1
------------
1
# (4)RAW类型与字符型统一规则
RAW类型只可与自身或字符型进行比较,规则如下:
(行列标题格为参与=、!= 或 <>、>、>=、<、<=比较符运算的数据类型;内容单元格为统一后的数据类型。)
数据类型 | RAW | 字符型 |
---|---|---|
RAW | RAW | RAW |
字符型 | RAW | 字符型 |
# (4)udt类型比较统一规则
- OBJECT类型默认只支持等于、不等于运算。已创建方法的OBJECT类型支持等于、不等于、大于、大于等于、小于、小于等于的运算,且根据其方法的结果进行比较。
- VARRAY类型不支持等于、不等于、大于、大于等于、小于、小于等于运算。
- TABLE类型只支持等于、不等于运算。
- 当UDT类型嵌套UDT类型时,目前不支持TABLE类型、未创建方法的OBJECT的比较,其他UDT类型嵌套时每一层UDT类型都需遵循比较规则。
- 支持等于、不等于运算的类型,也支持[NOT] IN运算。
- 所有UDT类型不支持[NOT] LIKE运算。
- 仅已创建方法的OBJECT类型支持[NOT] BETWEEN AND。
- 所有UDT类型支持IS [NOT] NULL运算。