GBase 8a
运维管理
文章

函数和操作符

发表于2025-12-28 20:41:0369次浏览2个评论

操作符

操作符优先级

说明

操作符优先级在下面列出,从最高到最低。

同一行的操作符具有同样的优先级。

BINARY,COLLATE
!
^
-(unary minus),
~(unary bit inversion)
*
,/,DIV ,%,MOD
-
,+
<<,>>
&
|
=
,<=>,>=
,>,<=
,<,<>,!=
,IS,LIKE,REGEXP ,IN
BETWEEN,CASE,WHEN,THEN,ELSE
NOT
&&,AND
OR,XOR
:=

圆括号

说明

(...)

括号,使用它来规定一个表达式的运算顺序,放在括号里的操作符优先执行。

示例

示例 1:不使用括号,表达式先执行乘法操作,再执行加法操作。

gbase> SELECT 1+2*3 FROM dual;
+-------+
| 1+2*3 |
+-------+
| 7 |
+-------+
1 row in set

示例 2:使用括号,表达式先执行括号中的加法操作,再执行括号外的乘法操作。

gbase> SELECT (1+2)*3 FROM dual;
+---------+
| (1+2)*3 |
+---------+
| 9 |
+---------+
1 row in set

比较函数和操作符

概述

比较运算的结果是 1(TRUE)、0(FALSE)或 NULL。

这些运算可用于数字和字符串上。根据需要,字符串将会自动地被转换为数字,

而数字也可自动转换为字符串。

说明

本章中的一些函数(如 GREA TEST() 和 LEAST())的所得值虽然不包括 1 (TRUE)、0(FALSE)或 NULL,但对参数值进行比较时,也会基于下述规则。

GBase 8a MPP Cluster 使用下列规则进行比较:

• 如果一个或两个参数是 NULL,比较的结果是 NULL,除了<=>比较符 (含有 NULL 参数时,<=>的比较结果不是 NULL)。

• 如果在一个比较操作中两个参数均是字符串, 它们作为字符串被比较 (默认不区分大小写)。

• 如果两个参数均是数值,它们按照数值被比较。

• 如果比较操作中,一个参数为字符串,另一个为数值,则将字符串转换为数值后,按照数值进行比较。字符串转换为数值,对于数字开头的字符串,转换为数值的结果是截取前面的数值部分;对于非数字开头的字符串,转换成数值的结果为 0。

• 十六进制值如果不与一个数字进行比较,那么它将被当作一个二进制字符串。

• 如果参数之一是 DATETIME 列类型, 而其他参数是一个常量, 在比较执行之前,这个常量被转换为一个时间戳。

• 在其它情况下,参数作为浮点(REAL)数字被比较。

注意:IN()中的参数不是这样的。为了安全起见,建议用户在比较时使用完整的DATETIME/DA TE/TIME 字符串。

为了进行比较,用户可以使用 CAST()函数将某个值转为另外一个类型。

= 等于

语法

a=b

表达式说明

如果两个操作数相等,则返回 1。

示例

示例 1:两个操作数都是数字。

gbase> SELECT 1 = 0 FROM dual;
+-------+
| 1 = 0 |
+-------+
| 0 |
+-------+
1 row in set

示例 2:数字与字符串进行比较。

gbase> SELECT '0' = 0 FROM dual;
+---------+
| '0' = 0 |
+---------+
| 1 |
+---------+
1 row in set

示例 3:浮点数与数字进行比较。

gbase> SELECT 0.0 = 0 FROM dual;
+---------+
| 0.0 = 0 |
+---------+
| 1 |
+---------+
1 row in set

示例 4:两个操作数都是 NULL。

gbase> SELECT NULL = NULL FROM dual;
+--------------+
| NULL = NULL |
+--------------+
| NULL |
+--------------+
1 row in set

<=> NULL 值安全等于

语法

a<=>b

表达式说明

这个操作符像“=”操作符一样执行相等比较,但在下面 2 种情况下,获得的结果与“=”不同:

1. 如果所有的操作数都是 NULL,那么返回的是 1 而不是 NULL。

2. 如果有且只有一个操作数是 NULL,那么返回的是 0 而不是 NULL。

示例

示例 1:所有操作数为 NULL,或部分操作数为 NULL。

gbase> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL FROM dual;
+---------+---------------+-------------+
| 1 <=> 1 | NULL <=> NULL | 1 <=> NULL |
+---------+---------------+-------------+
| 1 | 1 | 0 |
+---------+---------------+-------------+
1 row in set

示例 2:=操作符的结果

gbase> SELECT 1 = 1, NULL = NULL, 1 = NULL FROM dual;
+-------+-------------+-----------+
| 1 = 1 | NULL = NULL | 1 = NULL |
+-------+-------------+-----------+
| 1 | NULL | NULL |
+-------+-------------+-----------+
1 row in set

 <> , != 不等于

语法

a<>b 或 a!=b

表达式说明

如果两个操作数不相等, 则返回 1。 如果其中一个操作数是 NULL, 则返回 NULL。

示例

示例 1:操作数都为字符串。

gbase> SELECT '01'<>'1' FROM dual;
+-----------+
| '01'<>'1' |
+-----------+
| 1 |
+-----------+
1 row in set

示例 2:其中一个操作数为字符串。

gbase> SELECT 01<>'1' FROM dual;
+---------+
| 01<>'1' |
+---------+
| 0 |
+---------+
1 row in set

示例 3:操作数都为字符串。

gbase> SELECT 'zapp' <> 'zappp' FROM dual;
+-------------------+
| 'zapp' <> 'zappp' |
+-------------------+
| 1 |
+-------------------+
1 row in set

<= 小于或者等于

语法

a<=b

表达式说明

如果 a 小于或等于 b,则返回 1。如果其中一个操作数是 NULL,则返回 NULL。

示例

示例 1:两个操作数都为数字。

gbase> SELECT 0.1 <= 2 FROM dual;
+----------+
| 0.1 <= 2 |
+----------+
| 1 |
+----------+
1 row in set

< 小于

语法

a

表达式说明

如果 a 小于 b,则返回 1。如果其中一个操作数是 NULL,则返回 NULL。

示例

示例 1:两个操作数都为数字。

gbase> SELECT 2 < 2 FROM dual;
+-------+
| 2 < 2 |
+-------+
| 0 |
+-------+
1 row in set

>= 大于或者等于

语法

a>=b

表达式说明

如果 a 大于或等于 b,则返回 1。如果其中一个操作数是 NULL,则返回 NULL。

示例

示例 1:两个操作数都为数字。

gbase> SELECT 2 >= 2 FROM dual;
+--------+
| 2 >= 2 |
+--------+
| 1 |
+--------+
1 row in set

> 大于

语法

a>b

表达式说明

如果 a 大于 b,则返回 1。如果其中一个操作数是 NULL,则返回 NULL。

示例

示例 1:两个操作数都为数字。

gbase> SELECT 2 > 2 FROM dual;
+-------+
| 2 > 2 |
+-------+
| 0 |
+-------+
1 row in set

IS [NOT]

语法

IS [NOT]

函数说明

根据一个布尔值来检验一个值,此处的布尔值可以是 NULL、TRUE、FALSE 或 UNKNOWN。

示例

示例 1:使用 IS 语句检验 1、0 和 NULL。

gbase> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN FROM dual;
+-----------+------------+------------------+
| 1 IS TRUE | 0 IS FALSE | NULL IS UNKNOWN |
+-----------+------------+------------------+
| 1 | 1 | 1 |
+-----------+------------+------------------+
1 row in set

示例 2:使用 IS NOT 语句检验 1、0 和 NULL。

gbase> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN FROM dual;
+------------------+------------------+----------------------+
| 1 IS NOT UNKNOWN | 0 IS NOT UNKNOWN | NULL IS NOT UNKNOWN |
+------------------+------------------+----------------------+
| 1 | 1 | 0 |
+------------------+------------------+----------------------+
1 row in set

示例 3:使用 IS 语句检验一个值是否是 NULL。

gbase> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL FROM dual;
+-----------+-----------+---------------+
| 1 IS NULL | 0 IS NULL | NULL IS NULL |
+-----------+-----------+---------------+
| 0 | 0 | 1 |
+-----------+-----------+---------------+
1 row in set

示例 4:使用 IS NOT 语句检验一个值是否是 NULL。

gbase> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL FROM dual;
+---------------+---------------+-------------------+
| 1 IS NOT NULL | 0 IS NOT NULL | NULL IS NOT NULL |
+---------------+---------------+-------------------+
| 1 | 1 | 0 |
+---------------+---------------+-------------------+
1 row in set

expr BETWEEN min AND max

语法

expr BETWEEN min AND max

函数说明

如果 expr 的值在 min 和 max 之间(包括 min 和 max),返回 1,否则返回 0。若所有参数都是同一类型,则上述关系相当于表达式(min <= expr AND expr <= max)。其它类型的转换根据本章开篇所述规则进行,且适用于三种参数中任意一种。

示例

示例 1:所有参数为同一类型,expr 不在 min 和 max 中。

gbase> SELECT 1 BETWEEN 2 AND 3 FROM dual;
+-------------------+
| 1 BETWEEN 2 AND 3 |
+-------------------+
| 0 |
+-------------------+
1 row in set

示例 2:所有参数为同一类型,expr 在 min 和 max 中。

gbase> SELECT 'b' BETWEEN 'a' AND 'c' FROM dual;
+-------------------------+
| 'b' BETWEEN 'a' AND 'c' |
+-------------------------+
| 1 |
+-------------------------+
1 row in set

示例 3:参数中包含数字和字符串。

gbase> SELECT 2 BETWEEN 2 AND '3' FROM dual;
+---------------------+
| 2 BETWEEN 2 AND '3' |
+---------------------+
| 1 |
+---------------------+
1 row in set

 expr NOT BETWEEN min AND max

语法

expr NOT BETWEEN min AND max

等同于

NOT(expr BETWEEN min AND max)

COALESCE(value,...)

语法

COALESCE(value,...)

函数说明

返回值为列表当中的第一个非 NULL 值,在全部为 NULL 值的情况下返回值为

NULL。

示例

示例 1:其中一个参数值为 NULL。

gbase> SELECT COALESCE(NULL,1) FROM dual;
+------------------+
| COALESCE(NULL,1) |
+------------------+
| 1 |
+------------------+
1 row in set

示例 2:每个参数值都为 NULL。

gbase> SELECT COALESCE(NULL,NULL,NULL) FROM dual;
+--------------------------+
| COALESCE(NULL,NULL,NULL) |
+--------------------------+
| NULL |
+--------------------------+
1 row in set

GREATEST(value1,value2,...)

语法

GREATEST(value1,value2,...)

函数说明

当有两个或多个参数时,返回值为最大的参数值。

当参数中有一个为 NULL 时,直接返回 NULL。

当参数都是字符串时,默认是不区分大小写的,如果希望进行字符串取值大小写敏感的比较,则在需要敏感的字符串参数前加上 BINARY。

 这些参数比较使用下列规则:

• 如果返回值在 INTEGER 上下文中或者所有的参数是整型值,那么它们使用整数比较;

• 如果返回值在 REAL 上下文中或者所有的参数是实数值, 那么它们使用实数比较;

• 如果所有的参数是大小写敏感的字符串,那么参数比较也是大小写敏感的;其它情况下,参数比较大小写不敏感。

示例

示例 1:参数值为整型数字。

gbase> SELECT GREATEST(2,0) FROM dual;
+---------------+
| GREATEST(2,0) |
+---------------+
| 2 |
+---------------+
1 row in set

示例 2:参数值为浮点型数字。

gbase> SELECT GREATEST(34.0,3.0,5.0,767.0) FROM dual;
+------------------------------+
| GREATEST(34.0,3.0,5.0,767.0) |
+------------------------------+
| 767.0 |
+------------------------------+
1 row in set

示例 3:参数值为字符串,不区分大小写。

gbase> SELECT GREATEST('B','a','C') FROM dual;
+-----------------------+
| GREATEST('B','a','C') |
+-----------------------+
| C |
+-----------------------+
1 row in set

示例 4:参数值为字符串,字符串参数前加上 BINARY,区分大小写。

gbase> SELECT GREATEST('B',BINARY 'a','C') FROM dual;
+------------------------------+
| GREATEST('B',BINARY 'a','C') |
+------------------------------+
| a |
+------------------------------+
1 row in set

示例 5:参数值中包含 NULL,则执行结果为 NULL。

gbase> SELECT GREATEST('B',NULL,'C') FROM dual;
+------------------------+
| GREATEST('B',NULL,'C') |
+------------------------+
| NULL |
+------------------------+
1 row in set

 expr IN (value,...)

语法

expr IN (value,...)

函数说明

如果 expr 是 IN 列表中的任一值,它将返回 1,否则返回 0。

如果 IN 列表中的所有值均是常量,那么所有的值被按照 expr 的类型进行计算和排序。

如果左边的表达式是 NULL,或者在列表中没有发现相匹配的值并且列表中的一个表达式是 NULL,IN 均返回 NULL。

IN()语法也可以用于子查询类型。

示例

示例 1:expr 不是 IN 列表中的任一值。

gbase> SELECT 2 IN (0,3,5,'8') FROM dual;
+------------------+
| 2 IN (0,3,5,'8') |
+------------------+
| 0 |
+------------------+
1 row in set

示例 2:expr 是 IN 列表中的值。

gbase> SELECT '1' IN (0,3,5,'1') as v1,_'1' IN (0,3,5,NULL) as v_null FROM dual;
+-----+--------+
| v_1 | v_null |
+-----+--------+
| 1 | NULL |
+-----+--------+
1 row in set

示例 3:expr 的值为 NULL。

gbase> SELECT NULL IN (0,3,5,'wefwf') FROM dual;
+-------------------------+
| NULL IN (0,3,5,'wefwf') |
+-------------------------+
| NULL |
+-------------------------+
1 row in set

示例 4:子查询中包含 IN()函数。

示例中用到的表及数据:

CREATE TABLE sc (sno VARCHAR(4), grade INT);
INSERT INTO sc VALUES ('101',82),('102',59),('103',90),('104',88),('106',82);

查询所有课程都及格的同学的学号。

gbase> SELECT sno FROM sc WHERE grade IN (SELECT grade FROM sc WHERE grade>60) GROUP BY sno;
+------+
| sno |
+------+
| 103 |
| 101 |
| 104 |
| 106 |
+------+
4 rows in set

 expr NOT IN (value,...)

语法

expr NOT IN (value,...)

等价于

NOT(expr IN (value,...))

 ISNULL(expr)

语法

ISNULL(expr)

函数说明

如果 expr 为 NULL,ISNULL()的返回值为 1,否则返回值为 0。

示例

示例 1:expr 的值不为 NULL。

gbase> SELECT ISNULL(1+1) FROM dual;
+-------------+
| ISNULL(1+1) |
+-------------+
| 0 |
+-------------+
1 row in set

示例 2:1/0 的结果为 NULL,ISNULL()的返回值为 1。

gbase> SELECT ISNULL(1/0) FROM dual;
+-------------+
| ISNULL(1/0) |
+-------------+
| 1 |
+-------------+
1 row in set

示例 3:对 NULL 值使用“=”进行比较,ISNULL()结果为 1。

gbase> SELECT ISNULL(NULL=NULL) FROM dual;
+-------------------+
| ISNULL(NULL=NULL) |
+-------------------+
| 1 |
+-------------------+
1 row in set

ISNULL()函数同 IS NULL 比较操作符具有一些相同的特性。IS NULL 的使用请 参考“ IS [NOT]”中的示例 3

LEAST(value1,value2,...)

语法

LEAST(value1,value2,...)

函数说明

有两个或者更多的参数,返回最小的参数值。假如任意一个变量为 NULL,则LEAST()的返回值为 NULL。

LEAST()对参数进行比较所依据的规则与 GREATEST()相同。

示例

示例 1:参数值为整型数字,返回最小的参数值。

gbase> SELECT LEAST(2,0) FROM dual;
+------------+
| LEAST(2,0) |
+------------+
| 0 |
+------------+
1 row in set

示例 2:参数值为浮点型数字,返回最小的参数值。

gbase> SELECT LEAST(34.0,3.0,5.0,767.0) FROM dual;
+---------------------------+
| LEAST(34.0,3.0,5.0,767.0) |
+---------------------------+
| 3.0 |
+---------------------------+
1 row in set

示例 3:参数值为字符串,不区分大小写。

gbase> SELECT LEAST('B','A','C') FROM dual;
+--------------------+
| LEAST('B''A',,'C') |
+--------------------+
| A |
+--------------------+
1 row in set
gbase> SELECT LEAST('B','a','C') FROM dual;
+---------------------+
| LEAST('B','a','C') |
+---------------------+
| a |
+---------------------+
1 row in set

示例 4:参数值为字符串,字符串参数前加上 BINARY,区分大小写。

gbase> SELECT LEAST(BINARY 'B',BINARY 'a','C') FROM dual;
+-----------------------------------+
| LEAST(BINARY 'B',BINARY 'a','C') |
+-----------------------------------+
| B |
+-----------------------------------+

1 row in set

示例 5:参数值中包含 NULL,则执行结果为 NULL。

gbase> SELECT LEAST('C',NULL,'B') FROM dual;
+---------------------+
| LEAST('C',NULL,'B') |
+---------------------+
| NULL |
+---------------------+
1 row in set

评论

登录后才可以发表评论
用户头像
GBase用户28017发表于 7个月前
学习了。
半夏发表于 2个月前
学会了