返回首页

gbase数据、南大通用产品文档:GBase8c条件表达式

更新日期:2024年09月11日

在执行SQL 语句时,可通过条件表达式筛选出符合条件的数据。
条件表达式主要有以下几种:

CASE
CASE 表达式是条件表达式,类似于其他编程语言中的CASE 语句。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
598
CASE 表达式的语法图请参考图6-1。
图6-1 case::=
CASE 子句可以用于合法的表达式中。condition 是一个返回BOOLEAN 数据类型的表
达式:

如果结果为真,CASE 表达式的结果就是符合该条件所对应的result。

如果结果为假,则以相同方式处理随后的WHEN 或ELSE 子句。

如果各WHEN condition 都不为真,
表达式的结果就是在ELSE 子句执行的result。
如果
省略了ELSE 子句且没有匹配的条件,结果为NULL。
示例:
gbase=# CREATE TABLE public.case_when_t1(CW_COL1 INT);
CREATE TABLE
gbase=# INSERT INTO public.case_when_t1 VALUES (1), (2), (3);
INSERT 0 3
gbase=# SELECT * FROM public.case_when_t1;
cw_col1
---------
1
2
3
(3 rows)
gbase=# SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two'
ELSE 'other' END FROM public.case_when_t1 ORDER BY 1;
cw_col1 | case
---------+-------
1 | one
2 | two
3 | other
(3 rows)
gbase=# DROP TABLE public.case_when_t1;

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
599
DROP TABLE

DECODE
DECODE 的语法图请参见图6-2。
图6-2 decode::=
将表达式base_expr 与后面的每个compare(n) 进行比较,
如果匹配返回相应的value(n)。
如果没有发生匹配,则返回default。
示例请参见5.24 条件表达式函数。
gbase=# SELECT DECODE('A','A',1,'B',2,0);
case
------
1
(1 row)

COALESCE
COALESCE 的语法图请参见图6-3。
图6-3 coalesce::=
COALESCE 返回它的第一个非NULL 的参数值。
如果参数都为NULL,
则返回NULL。
它常用于在显示数据时用缺省值替换NULL。和CASE 表达式一样,COALESCE 只计算用
来判断结果的参数,即在第一个非空参数右边的参数不会被计算。
示例
gbase=# CREATE TABLE public.c_tabl(description varchar(10), short_description
varchar(10), last_value varchar(10)) ;
CREATE TABLE

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
600
gbase=# INSERT INTO public.c_tabl VALUES('abc', 'efg', '123');
INSERT 0 1
gbase=# INSERT INTO public.c_tabl VALUES(NULL, 'efg', '123');
INSERT 0 1
gbase=# INSERT INTO public.c_tabl VALUES(NULL, NULL, '123');
INSERT 0 1
gbase=# SELECT description, short_description, last_value, COALESCE(description,
short_description, last_value) FROM public.c_tabl ORDER BY 1, 2, 3, 4;
description | short_description | last_value | coalesce
-------------+-------------------+------------+----------
abc
| efg
| 123
| abc
| efg
| 123
| efg
|
| 123
| 123
(3 rows)
gbase=# DROP TABLE public.c_tabl;
DROP TABLE
如果description 不为NULL ,则返回description 的值,否则计算下一个参数
short_description;如果short_description 不为NULL,则返回short_description 的值,否则计
算下一个参数last_value;
如果last_value不为NULL,
则返回last_value的值,
否则返回
(none)

gbase=# SELECT COALESCE(NULL,'Hello World');
coalesce
---------------
Hello World
(1 row)

NULLIF
NULLIF 的语法图请参见图6-4。
图6-4 nullif::=
只有当value1 和value2 相等时,NULLIF 才返回NULL。否则它返回value1。
示例
gbase=# CREATE TABLE public.null_if_t1 ( NI_VALUE1 VARCHAR(10),
NI_VALUE2
VARCHAR(10));

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
601
CREATE TABLE
gbase=# INSERT INTO public.null_if_t1 VALUES('abc', 'abc');
INSERT 0 1
gbase=# INSERT INTO public.null_if_t1 VALUES('abc', 'efg');
INSERT 0 1
gbase=# SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM
public.null_if_t1 ORDER BY 1, 2, 3;
ni_value1 | ni_value2 | nullif
-----------+-----------+--------
abc
| abc
|
abc
| efg
| abc
(2 rows)
gbase=# DROP TABLE public.null_if_t1;
DROP TABLE
如果value1 等于value2 则返回NULL,否则返回value1。
gbase=# SELECT NULLIF('Hello','Hello World');
nullif
--------
Hello
(1 row)

GREATEST(最大值)
,LEAST(最小值)
GREATEST 的语法图请参见图6-5。
图6-5 greatest::=
从一个任意数字表达式的列表里选取最大的数值。
示例:
gbase=# SELECT greatest(9000,155555,2.01);
greatest
----------
155555
(1 row)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
602
LEAST 的语法图请参见图6-6。
图6-6 least::=
从一个任意数字表达式的列表里选取最小的数值。
以上的数字表达式必须都可以转换成一个普通的数据类型,该数据类型将是结果类型。
列表中的NULL 值将被忽略。只有所有表达式的结果都是NULL 的时候,结果才是
NULL。
gbase=# SELECT least(9000,2);
least
-------
2
(1 row)
示例请参见5.24 条件表达式函数。

NVL
NVL 的语法图请参见图6-7。
图6-7 nvl::=
如果value1 为NULL 则返回value2,如果value1 非NULL,则返回value1。
示例:
gbase=# SELECT nvl(null,1);
nvl
-----
1
(1 row)
gbase=# SELECT nvl ('Hello World' ,1);

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
603
nvl
---------------
Hello World
(1 row)

69% /data1

/dev/nvme1n1

这个示例将变量new_sal传递给过程adjust_salary。该过程将一个值赋给相应的形式参
数sal。由于sal是一个 IN OUT 参数,变量new_sal在过程结束后保留了赋值。
DECLARE
done BOOLEAN; -- Initial value is NULL by default
counter NUMBER := 0;
BEGIN
done := FALSE; -- Assign literal value
WHILE done != TRUE -- Compare to literal value
LOOP
counter := counter + 1;
done := (counter > 500); -- Assign value of BOOLEAN expression
END LOOP;
END;