达梦数据库适配过程中,主要需要兼容的,是sql语句中的json相关函数的适配,如果查询语句中,使用到了聚合函数,要对非聚合的字段,进行分组(在mysql数据库中,在此情况下,没有对分组做严格要求)

一.达梦数据库中对json相关函数的适配参照

MySQL:(JSON_SET函数)

【示例】

JSON_SET(ifnull(a.extra,'{}'),'$.ywlx',ifnull(a.ywlx,''),'$.nywlx',ifnull(a.nywlx,'')) extra

达梦:(jsonb_set函数)

【示例】

 jsonb_set(jsonb_set(ifnull(a.extra,'{}'),'{ywlx}',ifnull(concat('"',a.ywlx,'"'),'""')),'{nywlx}',ifnull(concat('"',a.nywlx,'"'),'""')) extra

人大金仓:(jsonb_set函数)

说明:人大金仓数据库,使用jsonb_set函数时,需要将json数据的键值对进行数据转型处理

【示例】

jsonb_set(jsonb_set(ifnull(extra::JSONB,'{}'),'{ywlx}',ifnull(to_json(ywlx),'""')),'{nywlx}',ifnull(to_json(nywlx),'""')) extra

MySQL:(json_remove函数)

【示例】

extra = JSON_REMOVE(ifnull(extra, '{}'), CONCAT('$.',#{node}))

达梦:(jsonb_strip_nulls + jsonb_set函数)

说明:先将要移除的键值对中的value值,使用jsonb_set置为null,再使用jsonb_strip_nulls,移除value为null的键值对)

【示例】

extra = jsonb_strip_nulls(jsonb_set(ifnull(extra,'{}'),concat('{',#{node},'}'),'null',false))

人大金仓数据库:(jsonb_strip_nulls + jsonb_set函数)

说明:人大金仓数据库,使用jsonb_set函数时,需要将json对象的值,进行类型转换

【示例】

extra = jsonb_strip_nulls(jsonb_set(ifnull(extra::jsonb,'{}'),'{${node}}','null',false))

MySQL:(json箭头函数)

【示例】

select
   id,label,value,category,pid,deleted
from
   sys_dict
where
   category = #{category}
order by
   value -> '$.index'
asc

达梦(json_value函数)

【示例】

select
  id,label,value,category,pid,deleted
from
  sys_dict
where
  category = #{category}
order by
  json_value(value,'$.index')
asc

人大金仓

(json键值对只有一层路径的情况下,如{“name”:”zhangsan”} : json对象转换类型后,使用箭头函数)

【示例】

select
   id,label,value,category,pid,deleted
from
    sys_dict
where
    category = #{category}
order by
    value::jsonb ->> 'index'

(json键值对,有多层路径的情况下,如{“InfoDatas”:{“name”:”张三”}},使用json_extract_path_text函数)

【示例】

count(json_extract_path_text(json_extract_path_text(b.extra::jsonb,'changeLog')::jsonb,'rename')) AS manualRenameNum

MySQL:(json箭头函数,获取value为数组格式的键值对的值)

数据格式:{ “systemIds”: [“1574286870436925449”]}

【示例】

and extra -> '$.systemIds' like concat('%',#{param.systemId},'%')

达梦(json_query函数)

【示例】

and json_query(extra,'$.systemIds') like concat('%',#{param.systemId},'%')

人大金仓(json_extract_path_text 或json箭头函数)

and json_extract_path_text(extra::jsonb,'systemIds') like concat('%',#{param.systemId},'%')

二.MySQL中,有一个很重要的语法叫on duplicate key update

【MySQL】

insert into case_trial_member(id, case_id, user_code, sn, main, user_name, type)
value (#{id},#{caseId},#{userCode},#{sn},#{main}, #{userName},#{type})
ON DUPLICATE KEY UPDATE user_name=#{userName},main=#{main}, type =#{type}

【达梦数据库中,对此方法的适配如下】

MERGE INTO case_trial_member T1
        USING(
        select
          #{caseTrialMember.id} id,
          #{caseTrialMember.caseId} case_id,
          #{caseTrialMember.userCode} user_code,
          #{caseTrialMember.userName} user_name,
          #{caseTrialMember.sn} sn,
          #{caseTrialMember.main} main,
          #{caseTrialMember.type} type
          from dual
        )T2 on(T1.case_id = T2.case_id and T1.user_code=T2.user_code)
        WHEN NOT MATCHED THEN INSERT (id,case_id,user_code,user_name,sn,main,type)
        VALUES (T2.id,T2.case_id,T2.user_code,T2.user_name,T2.sn,T2.main,T2.type)
        WHEN MATCHED THEN UPDATE
        SET T1.update_time=GETDATE()

【人大金仓数据库适配如下】

insert into directory_mapping(origin_directory_id,target_directory_id,mapping_name,case_id) values(
        #{originDirectoryId},#{targetDirectoryId},#{mappingName},#{caseId})
        ON CONFLICT (origin_directory_id,target_directory_id)
        DO
        UPDATE
        SET target_directory_id=#{targetDirectoryId}

三.关于Mysql数据库中,update_time字段值自动更新的问题

【MySQL】

达梦和人大金仓基本上都是使用触发器去实现的

【达梦】

【人大金仓】

四.达梦数据库和人大金仓数据库,对MySQL数据库中一些表的虚拟列的适配

【达梦】

【人大金仓】

五.全文检索

【MySQL】

MySQL数据库的case_info表中有一个case_name_word字段,用于配合SQL中的MATCH语法做全文案件名称检索

对于此检索方式,达梦数据库和人大金仓数据库使用上,有所差别

【达梦】

【人大金仓】

六.MySQL和人大金仓数据库,均支持FIND_IN_SET函数,但是达梦数据库的函数方法中,没有此函数,因为只能自己创建一个同名函数,去实现该功能

参照网页:https://blog.csdn.net/zhangkaidsy/article/details/101053481

七.关于整数计算的问题

MySQL和人大金仓数据库,计算数字类型的值时,整数除以整数是,如果结果是一个非整数形式的分数,则以小数形式展示,如:1/2=0.5 ,但是达梦是以整数的形式展示的,这样可能会造成数据上的错误,对此,达梦的解决办法如下

【MySQL】

【人大金仓】

【达梦】

先查询模式,如果para_value值为0,则向下取整

此时需要将para_value值改为1,再查询,就是精确到小数

注意,修改了值后,需要重启达梦数据库,才能使配置生效,因此慎用

八.关于引号转义的问题

MySQL和达梦数据库,引号转义用 \ 符,人大金仓 引号转义 用单引号(英文字符)

九.人大金仓时间函数及其相关 专题

时间格式的数据,如果想要获得时分秒的精确数据,则需要将类型转换为timestamptz类型,否则只能拿到年月日的信息,时分秒的信息为00:00:00

时间戳格式的数据,转换为年月日

获取当前系统时间函数

作者:hzw  创建时间:2024-01-31 17:15
最后编辑:hzw  更新时间:2024-11-15 23:02