跳到主要内容返回博客列表达梦 DECODE 函数使用小技巧
大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。 为了给大家提供一些技术交流的平台,目前已成立的技术交流群: - Oracle 数据库交流群 - 国产数据库交流群 - Linux 技术交流群 - ChatGPT 4o 免费体验群 需要进群(均已超过 200 人,需要邀请)可以添加号主微信:Lucifer-0622,备注对应的群名即可。 @TOC目录 今天群友问了一个问
- 2738+ 篇实战文章
- 1500+ 步骤截图
- 10 大核心模块
大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
社群交流
本章目标:掌握本章核心知识点
前置要求:完成前序章节学习
预计时长:60 分钟
为了给大家提供一些技术交流的平台,目前已成立的技术交流群:
- Oracle 数据库交流群
- 国产数据库交流群
- Linux 技术交流群
- ChatGPT 4o 免费体验群
需要进群(均已超过 200 人,需要邀请)可以添加号主微信:Lucifer-0622,备注对应的群名即可。
前言
今天群友问了一个问题:达梦 decode 不能把字符串转数字么?


出于好奇,我打算测试一下,最终得到了解决方案,本文记录分享一下解决过程。
函数 DECODE
首先科普下函数 DECODE():
1语法:DECODE(exp, search1, result1, … searchn, resultn[,default])
功能:查表译码,DECODE 函数将 exp 与 search1,search2, … searchn 相比较,如果等于 searchx,则返回 resultx,如果没有找到匹配项,则返回 default, 如果未定义 default,返回 NULL。
例如:
1SQL> SELECT DECODE(1, 1, 'A', 2, 'B');
2
3DECODE(1,1,'A',2,'B')
4---------------------
5A
6
710:10:16 dmdba@DAMENG:5236 SQL> SELECT DECODE(3, 1, 'A', 2, 'B');
8
9DECODE(3,1,'A',2,'B')
10---------------------
11NULL
12
1310:10:21 dmdba@DAMENG:5236 SQL> SELECT DECODE(3, 1, 'A', 2, 'B', 'C');
14
15DECODE(3,1,'A',2,'B','C')
16-------------------------
17C
通过以上例子可以简单了解 DECODE 函数的用法。
问题复现
我赶紧连上达梦数据库,测试了一下,果然不支持:
1SQL> select decode(nvl(null,3),'其他',2,3,3,1) from dual;
2select decode(nvl(null,3),'其他',2,3,3,1) from dual;
3[-6111]:字符串转换出错.

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

这是为什么呢?
我第一反应可能是 达梦 decode 函数不支持隐式转换,所以改写了一下 SQL:
1-- 将需要比较的字符都改成同一个类型
2SQL> select decode(nvl(null,'3'),'其他',2,'3',3,1) from dual;
3
4DECODE(NVL(NULL,'3'),'其他',2,'3',3,1)
5----------------------------------------
63
果然执行不报错了,不过我还想着深究一下,觉得达梦不至于这个没考虑到。
解决方案
通过查询达梦官方文档,发现有一个参数可以解决这个问题:

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

根据上述解决方案,测试是否可以生效。
实战
查看当前数据库的参数值:
1SQL> select * from v$dm_ini where para_name = 'CASE_COMPATIBLE_MODE';
2
3PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE DEFAULT_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE SYNC_FLAG SYNC_LEVEL
4-------------------- ---------- --------- --------- ------------- ------- ---------- ---------- -------------------------------------------------------------------------------------------------------- --------- --------- ----------
5CASE_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:
1SQL> SP_SET_PARA_VALUE(1,'CASE_COMPATIBLE_MODE',2);
2DMSQL 过程已成功完成
系统级参数需要重启数据库生效:
1[dmdba@dm8:/home/dmdba]$ DmServiceDAMENG restart
2Stopping DmServiceDAMENG: [ OK ]
3Starting DmServiceDAMENG: [ OK ]
再次尝试使用函数 DECODE() 查询即可成功:
1SQL> select decode(nvl(null,3),'其他',2,3,3,1) from dual;
2
3DECODE(NVL(NULL,3),'其他',2,3,3,1)
4------------------------------------
53
已经可以正常执行。
写在最后
看来这也算是 Oracle 迁移到 DM 的一个小坑吧,问题比较简单,记录一下。
如果有遗漏或者不足的地方,欢迎评论区补充或者投稿,感谢阅读!
往期精彩文章
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
达梦 DECODE 函数使用小技巧 - DBA 学习之路