返回首页

gbase数据、南大通用产品文档:GBase8aIFNULL(expr1,expr2)

更新日期:2024年09月11日

语法
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 |

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
887
|
2 |
3 |
2 |
|
2 |
3 |
2 |
|
2 |
1 |
4 |
|
3 |
5 |
1 |
|
3 |
4 |
2 |
|
3 |
2 |
3 |
|
3 |
2 |
3 |
|
3 |
2 |
3 |
|
3 |
1 |
6 |
+------+------+------+
10 rows in set

当您在不符合 ANSI 的数据库中创建表时,所有用户都有访问该表的权限,直到您作为该
表的所有者取消特定用户的表级别权限为止。
下表介绍控制用户可如何访问表的四种权限。

权限
用途
Select 逐表授予权限,并允许您从表选择行。(此权限可限定于表中的特定列。)
Delete 允许您删除行。
Insert 允许您插入行。
Update 允许您更新现有的行(即,更改其内容)。

创建数据库和表的人们经常将 Connect 和 Select 权限授予 public,
以便所有用户都拥有它
们。如果您可查询表,则您至少具有对那个数据库和表的 Connect 和 Select 权限。
您需要其他的表级别权限来修改数据。表的所有者经常保留这些权限,或仅将它们授予特
定的用户。因此,您可能无法修改您可自由地查询的一些表。
例如,由于这些权限都是逐表授予的,因此您仅可拥有对一个表的 Insert 权限,以及仅拥
有对另一表的 Update 权限。甚至可进一步将 Update 权限限定于表中的特定列。
要获取关于这些及其他表级别权限的更多信息,请参阅《GBase 8s 数据库设计和实现指
南》。