人大金仓kingbase数据迁移及使用问题

2,687 阅读1分钟
kingbase(单引号空值)判断失效

字符串判空问题,金仓直接把空字符串当成null,这样在sql里使用 a = ''判断空就会有问题,需要改一下数据库data目录下的kingbase.conf文件;添加 参数ora_input_emptystr_isnull=off 重启数据库 生效

ora_input_emptystr_isnull=off

无效的编码序列UTF8

kingbase.conf增加 ignore_char_null_check=true 处理完成后注释掉

ignore_char_null_check=true

MySql数据迁移到金仓后

MYSQL 中 field() 函数,可以用来对SQL中查询结果集进行指定顺序排序,不在其中的放在最前面。 KINGBASE 中可用函数 decode() 来满足指定顺序排序 。

-- MYSQL
SELECT t.kid, t.audit_state FROM t_dx_capital_allocated t WHERE 
t.YEAR = '2020' AND t.del_flag = 1 ORDER BY
FIELD( t.audit_state,-2,-3 ) DESC, t.update_time DESC LIMIT 20

-- KINGBASE
SELECT t.kid, t.audit_state FROM t_dx_capital_allocated t WHERE
t.YEAR = '2020' AND t.del_flag = 1 ORDER BY 
decode( t.audit_state, -3,1,-2, 2 ), t.update_time DESC LIMIT 20

MYSQL中GROUP_CONCAT()函数可以拼接字段为字符串。 KINGBSE中可以用String_agg()替换。

SELECT GROUP_CONCAT('%', t.id separator ';') FROM `score` t;
SELECT String_agg(CONCAT('%',C1), ';' ) FROM TABLE_NAME;

if()函数可用case when来代替:

COUNT( CASE WHEN t1.level = 'grade-001' THEN 1 ELSE NULL END ) AS sbjNum,
COUNT( CASE WHEN t1.level = 'grade-002' THEN 1 ELSE NULL END ) AS dsjNum,
COUNT( CASE WHEN t1.level = 'grade-003' THEN 1 ELSE NULL END ) AS xcjNum,
COUNT( CASE WHEN t1.level = 'grade-004' THEN 1 ELSE NULL END ) AS qtNum

IFNULL函数没有,需要替换为NVL() FIELD函数没有,需要替换为DECODE()

FIELD(t.audit_state,-2,-3) DESC,t.update_time DESC
decode( t.audit_state, -3,1,-2, 2 ),t.update_time DESC

group by中没有的字段需要转换:

SUBSTRING_INDEX(group_concat(lll.adminAreaId), ',', 1) AS adminAreaId,

转成大写:

CAST(SUBSTRING_INDEX(group_concat(lll.totalInvestAmount), ',', 1) AS NUMBER(15,2)) AS totalInvestAmount

日期格式:

to_char(CAST(TBDateTime AS TIMESTAMP), 'yyyy-mm') >= '2020-01'

varchar转int(字符串转数值)

to_number(attendEntNumberCloud)