返回首页

gbase数据、南大通用产品文档:GBase8cUNION,CASE 和相关构造

更新日期:2024年09月11日

SQL UNION 构造必须把那些可能不太相似的类型匹配起来成为一个结果集。解析算法
分别应用于联合查询的每个输出字段。
INTERSECT 和EXCEPT 构造对不相同的类型使用和
UNION 相同的算法进行解析。CASE、ARRAY、VALUES、GREATEST 和LEAST 构造也
使用同样的算法匹配它的部件表达式并且选择一个结果数据类型。
UNION,CASE 和相关构造解析

如果所有输入都是相同的类型,并且不是unknown 类型,那么解析成这种类型。

如果所有输入都是unknown 类型则解析成text 类型(字符串类型范畴的首选类
型)

否则,忽略unknown 输入。

如果输入不属于同一个类型范畴,失败。
(unknown 类型除外)

如果输入类型是同一个类型范畴,则选择该类型范畴的首选类型。
(例外:union 操作
会选择第一个分支的类型作为所选类型。

系统表pg_type 中typcategory 表示数据类型范畴,
typispreferred 表示是否是typcategory
分类中的首选类型。

把所有输入转换为所选的类型(对于字符串保持原有长度)
。如果从给定的输入到所选
的类型没有隐式转换则失败。

若输入中含json、txid_snapshot、sys_refcursor 或几何类型,则不能进行union。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
620
对于case 和coalesce,在TD 兼容模式下的处理

如果所有输入都是相同的类型,并且不是unknown 类型,那么解析成这种类型。

如果所有输入都是unknown 类型则解析成text 类型。

如果输入字符串(包括unknown,unknown 当text 来处理)和数字类型,那么解析成字
符串类型,如果是其他不同的类型范畴,则报错。

如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。

把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。
对于case,在ORA 兼容模式下的处理

decode(expr, search1, result1, search2, result2, ..., defresult),也即case expr when search1
then result1
when search2 then result2 else defresult end; 在ORA 兼容模式下的处理,

整个表达式最终的返回值类型定为result1 的数据类型,或者与result1 同
类型范畴的
更高精度的数据类型。
(例如,numeric 与int 同属数值类型范畴,但numeric 比int 精度
要高,具有更高优先级)

将result1 的数据类型置为最终的返回值类型preferType ,其所属类型范畴为
preferCategory。

依次考虑result2、
result3 直至defresult 的数据类型。
如果其类型范畴也是preferCategory,
即与result1 具有相同的类型范畴,则判断其精度(优先级)是否高于preferType,如
果高于,则将preferType 更新为更高精度的数据类型;如果其类型范畴不是
preferCategory,则判断其数据类型是否可以隐式转换为preferType,不可以则报错。

将最终preferType 记录的数据类型作为整个表达式最终的返回值类型;表达式的结果
向此类型进行隐式转换。
注1:
为了兼容一种特殊情况,即表示了超大数字的字符类型向数值类型转换的情况,例如
select decode(1, 2, 2, "53465465676465454657567678676"),
大数超过了bigint、
double 等的表
示范围。所以,当result1 的类型范畴为数值类型时,将返回值的类型直接置为numeric,

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
621
以兼容此种特殊情况。
注2:
数值类型的优先级排序:
numeric>float8>float4>int8>int4>int2>int1
字符类型的优先
级排序:text>varchar=nvarchar2>bpchar>char
日期类型的优先级排序:
timestamptz>timestamp>smalldatetime>date>abstime>timetz>time
日期跨度类型的优先级排序:interval>tinterval>reltime 注3:
ORA 兼容模式,
开启set sql_beta_feature = 'a_style_coerce'; 参数的情况下,
所支持的隐
式类型转换见下图,\代表不需要转换,yes 表示支持,空白表示不支持:
示例
示例1:Union 中的待定类型解析。这里,unknown 类型文本'b'将被解析成text 类型。
gbase=#SELECT text 'a' AS "text" UNION
SELECT 'b'; text
------
a b
(2 rows)
示例2:简单Union 中的类型解析。文本1.2 的类型为numeric,而且integer 类型的1 可
以隐含地转换为numeric,因此使用这个类型。
gbase=#SELECT 1.2 AS "numeric" UNION SELECT 1; numeric
---------
1

使用 SECURITY_LOCALCONNECTION 配置参数,通过验证正在运行程序的本地用户的 ID 与
正在试图访问数据库的用户的 ID 是否相同,来验证本地连接的安全性。
onconfig.std 值
未设置。

0 = 不发生安全性检查。
1 = GBase 8s 检查正在运行程序的用户的 ID 与正在试图连接到数据库的用户的 ID 是否
相配。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 137 -

2 = 与 1 相同,加之 GBase 8s 从网络 API 检索同级端口号并验证该连接是否正来自客
户端程序。 如果您的系统有 SOCTCP 或 IPCSTR 网络协议,则可仅指定 2。
生效
编辑 onconfig 文件并重启数据库服务器之后。

PG_USER_MAPPING
PG_USER_MAPPING 系统表存储从本地用户到远程的映射。
需要有系统管理员权限才可以访问此系统表。普通用户可以使用视图
PG_USER_MAPPINGS 进行查询。
名称
类型
引用
描述
oid
oid
-
行标识符
(隐含属性,
必须明确选择)

umuser
oid
PG_AUTHID.oid
被映射的本地用户的OID,
如果用户映
射是公共的则为0。
umserver
oid
PG_FOREIGN_SERVE
R.oid
包含这个映射的外部服务器的OID。
umoptions
text[]
-
用户映射指定选项,使用“keyword=val
ue”格式的字符串。