语法 IFNULL(expr1,expr2) 函数说明 如果expr1 不为NULL,则IFNULL()的返回值为expr1,否则其返回值为expr2。 IFNULL()的返回值是数字或是字符串,具体情况取决于使用它的上下文环境。等 价于IF(expre1,expre1,expre2)。 示例 示例1:expr1 不为NULL,返回值为expr1。 gbase> SELECT IFNULL(1,0) FROM dual; +-------------+ | IFNULL(1,0) | +-------------+ | 1 | +-------------+ 1 row in set 示例2:expr1 为NULL,返回值为expr2。
GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 681 gbase> SELECT IFNULL(NULL,10) FROM dual; +-----------------+ | IFNULL(NULL,10) | +-----------------+ | 10 | +-----------------+ 1 row in set
RANK OVER 函数 语法 RANK() OVER([PARTITION BY col_name1,col_name2,…] ORDER BY col_name1 [ASC/DESC], col_name2 [ASC/DESC],…) 功能描述 根据ORDER BY 子句中表达式的值,从查询返回的每一行计算它们与其它行的 相对位置。组内的数据按ORDER BY 子句排序,然后给每一行赋一个号,从而 形成一个序列,该序列从1 开始,往后累加。 每次ORDER BY 表达式的值发生变化时,该序列也随之增加。有同样值的行得 到同样的数字序号(认为null 是相等的)。 如果两行得到同样的排序,则后面的序数将跳跃。例如,两行序数为1,则没有 序数2,序列将给组中的下一行分配值3。 仅Express 引擎支持。 在查询语句中,可以使用RANK 函数的子句为: 在SELECT 列表中: SELECT RANK() OVER(PARTITION BY i ORDER BY j) FROM t1 WHERE ...; 在最终ORDER BY 子句中(通过在查询中的其它位置使用RANK 函数的别 名或位置引用): SELECT *,RANK() OVER (ORDER BY j) FROM t1 WHERE ... ORDER BY RANK() OVER(ORDER BY i DESC); 在上述两个子句中,作为表达式或标量函数的参数: SELECT RANK() OVER (ORDER BY j DESC) + i FROM t1 WHERE ...; SELECT CONV(RANK() OVER(PARTITION BY i ORDER BY j ASC),10,2)FROM t 使用约束 下述情况不能使用: 在WHERE 子句的搜索条件中: SELECT ... FROM t1 WHERE RANK() OVER(ORDER BY i) > 3; -- error 作为聚集函数的参数: SELECT SUM(RANK() OVER(ORDER BY dollars)) FROM t1; -- error
GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 886 RANK 函数不得在HAVING 子句中使用: SELECT * FROM t1 GROUP BY i HAVING RANK() OVER(ORDER BY j) < 10; -- error RANK 函数不得在GROUP BY LIST 中: SELECT * FROM t1 GROUP BY RANK() OVER(ORDER BY i); -- error RANK 不能嵌套在其它RANK 内部: SELECT RANK() OVER(ORDER BY RANK() OVER(ORDER BY i )); -- error RANK 函数不得在DELETE 和UPDATE 语句的非查询部分: UPDATE t1 SET i = RANK () OVER(ORDER BY j) WHERE ...; --error 但是用在查询部分可以: UPDATE t1 SET i = i + 1 where j IN (SELECT RANK () OVER(ORDER BY t2.k) from t2); -- ok 注意 PARTITION BY 后面不能接ASC/DESC,ORDER BY 后面可以接 ASC/DESC。 示例 示例1:RANK() OVER(PARTITION BY i ORDER BY j desc) gbase> DROP TABLE IF EXISTS t1; Query OK, 0 rows affected gbase> CREATE TABLE t1(i int, j int); Query OK, 0 rows affected gbase> INSERT INTO t1 VALUES(2,1),(2,3),(2,3),(2,5),(3,2),(3,2),(3,2),(3,4), (3,1),(3,5); Query OK, 10 rows affected Records: 10 Duplicates: 0 Warnings: 0 gbase> SELECT *,RANK() OVER(PARTITION BY i ORDER BY j des c) AS rank FROM t1; +------+------+------+ | i | j | rank | +------+------+------+ | 2 | 5 | 1 |