暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

达梦 DECODE 函数使用小技巧

原创 Lucifer三思而后行 2024-11-21
933

大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。

社群交流

为了给大家提供一些技术交流的平台,目前已成立的技术交流群:

  • Oracle 数据库交流群
  • 国产数据库交流群
  • Linux 技术交流群
  • ChatGPT 4o 免费体验群

需要进群(均已超过 200 人,需要邀请)可以添加号主微信:Lucifer-0622,备注对应的群名即可。

目录

前言

今天群友问了一个问题:达梦 decode 不能把字符串转数字么?

出于好奇,我打算测试一下,最终得到了解决方案,本文记录分享一下解决过程。

函数 DECODE

首先科普下函数 DECODE()

语法:DECODE(exp, search1, result1, … searchn, resultn[,default])

功能:查表译码,DECODE 函数将 expsearch1,search2, … searchn 相比较,如果等于 searchx,则返回 resultx,如果没有找到匹配项,则返回 default, 如果未定义 default,返回 NULL

例如:

SQL> SELECT DECODE(1, 1, 'A', 2, 'B'); DECODE(1,1,'A',2,'B') --------------------- A 10:10:16 dmdba@DAMENG:5236 SQL> SELECT DECODE(3, 1, 'A', 2, 'B'); DECODE(3,1,'A',2,'B') --------------------- NULL 10:10:21 dmdba@DAMENG:5236 SQL> SELECT DECODE(3, 1, 'A', 2, 'B', 'C'); DECODE(3,1,'A',2,'B','C') ------------------------- C

通过以上例子可以简单了解 DECODE 函数的用法。

问题复现

我赶紧连上达梦数据库,测试了一下,果然不支持:

SQL> select decode(nvl(null,3),'其他',2,3,3,1) from dual; select decode(nvl(null,3),'其他',2,3,3,1) from dual; [-6111]:字符串转换出错.

image.png

但是在 Oracle 数据库是可以执行成功的:

这是为什么呢?

我第一反应可能是 达梦 decode 函数不支持隐式转换,所以改写了一下 SQL:

-- 将需要比较的字符都改成同一个类型 SQL> select decode(nvl(null,'3'),'其他',2,'3',3,1) from dual; DECODE(NVL(NULL,'3'),'其他',2,'3',3,1) ---------------------------------------- 3

果然执行不报错了,不过我还想着深究一下,觉得达梦不至于这个没考虑到。

解决方案

通过查询达梦官方文档,发现有一个参数可以解决这个问题:

搜索错误码 [-6111]:字符串转换出错 也可以搜索到相关内容:

根据上述解决方案,测试是否可以生效。

实战

查看当前数据库的参数值:

SQL> select * from v$dm_ini where para_name = 'CASE_COMPATIBLE_MODE'; PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE DEFAULT_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE SYNC_FLAG SYNC_LEVEL -------------------- ---------- --------- --------- ------------- ------- ---------- ---------- -------------------------------------------------------------------------------------------------------- --------- --------- ---------- CASE_COMPATIBLE_MODE 1 0 7 1 N 1 1 Case compatible mode, 0:none, 1:Oracle(simple case), 2:Oracle(simple case new rule), 4:Oracle(bool case) SYS ALL_SYNC CAN_SYNC

当前参数值为 1,我们需要修改参数值为 2:

SQL> SP_SET_PARA_VALUE(1,'CASE_COMPATIBLE_MODE',2); DMSQL 过程已成功完成

系统级参数需要重启数据库生效:

[dmdba@dm8:/home/dmdba]$ DmServiceDAMENG restart Stopping DmServiceDAMENG: [ OK ] Starting DmServiceDAMENG: [ OK ]

再次尝试使用函数 DECODE() 查询即可成功:

SQL> select decode(nvl(null,3),'其他',2,3,3,1) from dual; DECODE(NVL(NULL,3),'其他',2,3,3,1) ------------------------------------ 3

已经可以正常执行。

写在最后

看来这也算是 Oracle 迁移到 DM 的一个小坑吧,问题比较简单,记录一下。

如果有遗漏或者不足的地方,欢迎评论区补充或者投稿,感谢阅读!

往期精彩文章

达梦数据库安装最详细教程
一招教你学会达梦数据库的免密登录
一文讲透达梦数据库的大小写敏感
效率翻倍!达梦数据库 disql 使用技巧全攻略
达梦数据库参数配置与一键优化指南
达梦 AWR 报告快速上手指南
金仓数据库 KingbaseES V9 单机安装指南
KingbaseES KSQL 免密登录的几种方式
KingbaseES 控制文件冗余与恢复秘籍
金仓 KingbaseES RAC 入门指南
GBase 8a MPP 集群部署最佳实践
GBase 8a GDCA 认证课后练习题大全(题库)
南大通用 GBASE 8s V8.8 数据库最全安装指南
GBase 8s GDCA 认证课后练习题大全(题库)
GBase 8s 数据库巡检报告及一键巡检脚本
YashanDB 一键生成 AWR 报告
YashanDB 数据库安装部署
YashanDB 共享集群(YAC)入门指南与技术详解


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
最后修改时间:2024-11-21 10:21:05
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论