返回首页

gbase数据、南大通用产品文档:GBase8s其它函数

更新日期:2024年09月11日

还可以在使用常量的 SQL 表达式中的任意位置使用 LENGTH 、USER 、CURRENT 、
SYSDATE 和 TODAY 函数。另外,可以在 SELECT 语句中包括 DBSERVERNAME 函数
来显示当前数据库所驻留的数据库服务器的名称。
还可以使用这些函数来选择全部由常量值组成的表达式或包括列数据的表达式。在一个实
例中,对于所有输出行,结果相同。
另外,
可以使用 HEX 函数返回表达式的十六进制编码,
使用 ROUND 函数来返回表达式的
四舍五入值,使用 TRUNC 函数来返回表达式的截断值。有关上述函数的更多信息,请参
阅《GBase 8s SQL 指南:语法》。

LENGTH 函数
在下列查询中,LENGTH 函数针对 company 的长度大于 15 的每个行计算组
合 fname 和 lname 列的字节数。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 103 -

SELECT customer_num,
LENGTH (fname) + LENGTH (lname) namelength
FROM customer
WHERE LENGTH (company) > 15;
图: 查询结果
customer_num namelength

101 11
105 13
107 11
112 14
115 11
118 10
119 10
120 10
122 12
124 11
125 10
126 12
127 10
128 11
尽管 LENGTH 函数在使用 DB-Access 时可能不是非常有用,
但用于确定程序和报告的长度
时它就非常重要。LENGTH 函数返回 CHARACTER 或 VARCHAR 字符串的剪切长度以
及 TEXT 或 BYTE 字符串中的全部字节数。
GBase 8s 还支持 CHAR_LENGTH 函数,该函数在其字符串参数中返回逻辑字符数而不是
返回字节数。该函数在单个逻辑字符可能需要多个单字节存储的语言环境中非常有用。有
关 CHAR_LENGTH 函数的更多信息,
请参阅
《GBase 8s SQL 指南:
语法》

《GBase 8s GLS
用户指南》。

USER 函数
当想要定义仅包含包括您的用户标识行的表的受限视图时,使用 USER 函数。有关如何创
建视图的信息,请参阅《GBase 8s 数据库设计和实现指南》和《 GBase 8s SQL 指南:语
法》 中的 GRANT 和 CREATE VIEW 语句。
下列查询返回执行查询的用户的用户名(登录用户名),对表中的每行重复一次。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 104 -

SELECT * FROM cust_calls
WHERE user_id = USER;
如果当前用户的用户名是 richc,该查询仅检索 cust_calls 表中 user_id = richc 的行。
图: 查询结果
customer_num 110
call_dtime 1998-07-07 10:24
user_id richc
call_code L
call_descr Order placed one month ago (6/7) not received.
res_dtime 1998-07-07 10:30
res_descr Checked with shipping (Ed Smith). Order sent yesterday-we
were waiting for goods from ANZ. Next time will call with
delay if necessary

customer_num 119
call_dtime 1998-07-01 15:00
user_id richc
call_code B
call_descr Bill does not reflect credit from previous order
res_dtime 1998-07-02 08:21
res_descr Spoke with Jane Akant in Finance. She found the error and
is
sending new bill to customer

TODAY 函数
TODAY 函数返回当前系统日期。如果下列查询是在当前系统日期为 1998 年 7 月 10 日
时发出的,它返回这一行。
图: 查询
SELECT * FROM orders WHERE order_date = TODAY;
图: 查询结果
order_num 1018
order_date 07/10/1998
customer_num 121
ship_instruct SW corner of Biltmore Mall
backlog n

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 105 -

po_num S22942
ship_date 07/13/1998
ship_weight 70.50
ship_charge $20.00
paid_date 08/06/1998

DBSERVERNAME 和 SITENAME 函数
可以在 SELECT 语句中包含 DBSERVERNAME
(或它的同义词 SITENAME)
函数来查询
数据库服务器的名称。
可以查询 DBSERVERNAME 以找到具有行的任何表,
包括系统目录
表。
在下列查询中,
将标签 server 指定给 DBSERVERNAME 表达式并且也从 systables 系统目录
表中选择 tabid 列。此表描述数据库表,tabid 就是表标识。
图: 查询
SELECT DBSERVERNAME server, tabid
FROM systables
WHERE tabid <= 4;
图: 查询结果
server tabid

montague 1
montague 2
montague 3
montague 4
WHERE 子句限制显示的行数。否则,可能会对 systables 表的每一行显示数据库服务器名
一次。

HEX 函数
在下列查询中,HEX 函数返回 customer 中两列的十六进制格式,如下所示。
图: 查询
SELECT HEX (customer_num) hexnum, HEX (zipcode) hexzip
FROM customer;
图: 查询结果
hexnum hexzip


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 106 -

0x00000065 0x00016F86
0x00000066 0x00016FA5
0x00000067 0x0001705F
0x00000068 0x00016F4A
0x00000069 0x00016F46
0x0000006A 0x00016F6F


DBINFO 函数
可以在 SELECT 与中调用 DBINFO 函数来查询下列任何信息:

与 tblspace 号或表达式对应的 dbspace 的名称

表中插入的最后一个 SERIAL 、SERIAL8 或 BIGSERIAL 值

SELECT 、
INSERT 、
DELETE 、
UPDATE 、
MERGE 、
EXECUTE FUNCTION 、
EXECUTE PROCEDURE 或 EXECUTE ROUTINE 语句处理的行数

当前会话的会话 ID

会话连接的当前的数据库的名称

INSERT 、UPDATE 或 DELETE 语句是否作为应答事务一部分正在执行

数据库服务器在其上运行的主计算机的名称

操作系统的类型和主计算机的名称

全球标准时间(UTC)格式的本地时区和当前日期和时间

对应于指定的整型列或指定的 UTC 时间值的 DATETIME 值
(作为自 1970-01-01
00:00:00+00:00 的秒数)

客户机应用程序连接至的数据库服务器的精确版本或指定完整版本字符串的组件
可以在 SQL 语句中和 SPL 例程中的任何地方使用 DBINFO 函数。
下列查询显示可以和如何使用 DBINFO 函数来找出数据库服务器在其上运行的主计算机的
名称。
图: 查询
SELECT FIRST 1 DBINFO('dbhostname') FROM systables;
图: 查询结果
(constant)

lyceum

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 107 -

没有 FIRST 1 子句来限制 tabid 中的值,
将对 systables 表的每一行重复数据库服务器在其上
运行的计算机的主机名。
下列查询显示可以如何使用 DBINFO 函数来找出当前数据库服务
器的完整版号和类型。
图: 查询
SELECT FIRST 1 DBINFO('version','full') FROM systables;
有关如何使用 DBINFO 函数查找您当前数据库服务器、数据库会话或数据库的信息的更多
信息,请参阅《GBase 8s SQL 指南:语法》。

DECODE 函数
可以使用 DECODE 函数来将具有一个值的表达式转换为另一个值。DECODE 函数具有以
下格式:
DECODE(test, a, a_value, b, b_value, ..., n, n_value, exp_m )
在通常情况下,
当 a 等于 test 时 DECODE 函数返回 a_value,
当 b 等于 test 时,
返回 b_value,
当 n 等于 test 时返回 n_value 。
如果有若干表达式与 test 匹配,那么 DECODE 返回找到的第一个表达式的 n_value。如果
没有表达式与 test 匹配,
那么 DECODE 返回 exp_m;;
如果没有表达式与 test 匹配并且不存
在 exp_m,那么 DECODE 返回 NULL。
限制: DECODE 函数不支持类型为 TEXT 或 BYTE 的参数。
假设包括 emp_id 和 evaluation 列的 employee 表存在。此外还假设对 employee 表执行下列
查询则返回以下所示的行。
图: 查询
SELECT emp_id, evaluation FROM employee;
图: 查询结果
emp_id evaluation

012233 great
012344 poor
012677 NULL
012288 good
012555 very good
在某些情况下,您可能想要转换一组值。例如:假设您想要将前一示例中 evaluation 列的描
述值转换为相应的数字值。
下列查询显示如何使用DECODE 函数来针对 employee 表中的每
一行将 evaluation 列中的值转换为数字值。
图: 查询

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 108 -

SELECT emp_id, DECODE(evaluation, "poor", 0, "fair", 25, "good",
50, "very good", 75, "great", 100, -1) AS evaluation
FROM employee;
图: 查询结果
emp_id evaluation

012233 100
012344 0
012677 -1
012288 50
012555 75

可为 DECODE 函数的参数指定任何数据类型,只要这些参数满足以下需求:
参数 test 、a 、b 、... 、n 都具有相同的数据类型或求值为公共兼容的数据类型。
参数 a_value 、
b_value 、
... 、
n_value 都具有相同的数据类型或求值为公共兼容的数据类型。


NVL 函数
可以使用 NVL 函数将求值为 NULL 的表达式转换为您指定的值。NVL 函数接受两个参
数:第一个参数获取要求值的表达式的名称;第二个参数指定当第一个参数求值为 NULL
时函数返回的值。如果第一个参数求值不为 NULL,那么函数将返回第一个参数的值。假
设包括 name 和 address列的 student 表存在。同时假设对 student 表执行以下查询。
图: 查询
SELECT name, address FROM student;
图: 查询结果
name address

John Smith 333 Vista Drive
Lauren Collier 1129 Greenridge Street
Fred Frith NULL
Susan Jordan NULL
以下是包括 NVL 函数的一个示例,
该函数为表 address 列包含 NULL 值的每一行返回一个
新值。
图: 查询
SELECT name, NVL(address, "address is unknown") AS address

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 109 -

FROM student;
图: 查询结果
name address

John Smith 333 Vista Drive
Lauren Collier 1129 Greenridge Street
Fred Frith address is unknown
Susan Jordan address is unknown
可以为 NVL 函数指定任何数据类型,只要这两个参数求值为公共兼容的数据类型。
如果 NVL 函数的两个参数都求值为 NULL,那么函数返回 NULL。
GBase 8s 还支持 NULLIF 函数。该函数类似于 NVL 函数。但语义不同。如果其两个参数相
等,NULLIF 返回 NULL,或者两个参数不相等,将返回第一个参数。有关 NULLIF 函数
的更多信息,请参阅《GBase 8s SQL 指南:语法》。

功能
这个参数用于设置GBase 8a MPP Cluster 的错误日志文件。
该参数的默认路径为:
$GCLUSTER_BASE/log/$GCLUSTER_SID/system.log

本文档介如何设计、创建、查询和维护数据库,包括SQL 语句、存储过程、系统表和
视图等。