#比较运算符

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运算。