mysql实现oracle的decode和translate以及管道符拼接

发布时间:2020-08-14 03:58:04

来源:ITPUB博客

阅读:122

作者:贺子_DBA时代

目前要把网站整体业务迁移到云,并且又现在的oracle转换成mysql数据库,实现去ioe,现在有个任务是把oracle的一个视图在mysql中创建上,相关的基表已经创建完毕,想当然觉得只要把oracle的创建语句有拿出来,在mysql执行就可以了,其实真正过程遇到了很多问题,具体如下:

1,mysql 没有oracle的decode函数,

2,mysql t没有oracle的translate函数,

3,mysql create view 不能有子查询 ( 视图 第1349号错误解决方法)ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause

我的解决办法是 视图中包含视图

4,mysql CONCAT_WS和CONCAT的区别

首先看一下oracle当前的视图创建sql:

create or replace view infoservice.mail_tasks as

select a.mid as member_id,a.dingyue_id as dingyue_id ,a.cust_email as cust_email,duration_days,

memberinfo.cust_right_group as level1,

'{"member_name":"'|| TRANSLATE (memberinfo.CUST_NAME,'''"','__') ||'","keyword":"'||

TRANSLATE (a.keyword,'''"','__')||'","table_name2":"'||a.topicid||'",

"area_id":"'||a.areaid||'","category_id":"'||a.industryid||'"}' as query

from

(

select t.record_id as dingyue_id ,t.member_id as mid,t.cust_email as cust_email,

t.duration_days as duration_days,t.keyword as keyword,t.table_name,

t.industryid,

t.areaid,

decode( t.topicid , ',' ,decode(t.table_name,'zbxx',',a,b,c,d,e,f,g,h,','xmxx',',i,j,k,'), t.topicid) as topicid

from infoservice.t_member_my t,infoservice.t_member_my_info i

where i.my_id='1'

and t.member_id=i.member_id and t.sign = 0

and length(t.cust_email)>3

)

a ,infoservice.t_member_info memberinfo

where a.mid=memberinfo.record_id and memberinfo.cust_right_group != '0' and memberinfo.cust_status='正式';

针对遇到的问题,来作出相应的调整:

1,mysql 没有oracle的decode函数:

oracle中的decode函数的用处:

decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

该函数的含义如下:

IF 条件=值1 THEN

RETURN(翻译值1)

ELSIF 条件=值2 THEN

RETURN(翻译值2)

......

ELSIF 条件=值n THEN

RETURN(翻译值n)

ELSE

RETURN(缺省值)

END IF

decode(字段或字段的运算,值1,值2,值3)

这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3

当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多.

解决办法:

用case when 来替换:

把decode( t.topicid , ',' ,decode(t.table_name,'zbxx',',a,b,c,d,e,f,g,h,','xmxx',',i,j,k,'), t.topicid) as topicid

替换成

CASE WHEN t.topicid=',' then (case when t.table_name='zbxx' then ',a,b,c,d,e,f,g,h,' when t.table_name='xmxx' then ',i,j,k,' end ) else t.topicid end as topicid

2.mysql 没有oracle的translate函数

首先oracle的translate函数的作用:

TRANSLATE(string,from_str,to_str)

返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE 是 REPLACE 所提供的功能的一个超集。如果 from_str 比 to_str 长,那么在 from_str 中而不在 to_str 中的额外字符将从 string 中被删除,因为它们没有相应的替换字符。to_str 不能为空。Oracle 将空字符串解释为 NULL,并且如果TRANSLATE 中的任何参数为NULL,那么结果也是 NULL。

注意:一定注意oracle的translate的函数是一一对应的替换,并且它针对的是单个字符,而且是把from_str里面出现的字符全部都对应着换掉(要么换成to_str中对应的字符,要没有对应的就直接去掉),要区别于replace,replace针对的是字符串,必须要全部对应上,才能整体把from_str替换成to_str。

oracle TRANSLATE实例:

语法:TRANSLATE(expr,from,to)

expr: 代表一串字符,from 与 to 是从左到右一一对应的关系,如果不能对应,则视为空值。

举例:

SQL> select translate('abcbbaadef','ba','#@') from dual; (b将被#替代,a将被@替代)

TRANSLATE(

----------

@#c##@@def

SQL> select translate('abcbbaadef','bad','#@') from dual; (b将被#替代,a将被@替代,d对应的值是空值,将被移走)

TRANSLATE

---------

@#c##@@ef

oracle replace实例:

SQL> select replace('abcbbaadef','ba','#@') from dual; 将出现的整体ba替换成了#@

REPLACE('A

----------

abcb#@adef

SQL> select replace('abcbbaadef','bad','#@') from dual; ##没有完全匹配上的的bad,就没有替换

REPLACE('A

----------

abcbbaadef

针对mysql 没有oracle的translate函数的解决办法:

将TRANSLATE (memberinfo.CUST_NAME,'''"','__')替换成replace(replace(memberinfo.CUST_NAME,'''','_'),'"','_'),也就是先用replace替换单引号‘,然后在用个replace替换双引号“,(注意在sql中两个单引代表一个单引号)。

3,mysql create view 不能有子查询,否则报错ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause

解决办法:把相关子查询提前创建成一个视图,如下所示:

创建云上的视图:

create or replace view info.mail_tasks as

select a.mid as member_id,a.dingyue_id as dingyue_id ,a.cust_email as cust_email,duration_days,

memberinfo.cust_right_group as level1,

CONCAT_WS('','{"member_name":"',replace(replace(memberinfo.CUST_NAME,'''','_'),'"','_'),'","keyword":"',replace(replace(a.keyword,'''','_'),'"','_'),'","table_name2":"',a.topicid,'","area_id":"',a.areaid,'","category_id":"',a.industryid,'"}') as query

from info.mail_task_test

a ,info.v_member_info memberinfo

where a.mid=memberinfo.id and memberinfo.cust_right_group != '0' and memberinfo.cust_status='正式';

创建云上的子视图:

create view mail_task_testas

select t.record_id as dingyue_id ,t.member_id as mid,t.cust_email as cust_email,

t.duration_days as duration_days,t.keyword as keyword,t.table_name,

t.industryid,

t.areaid,

CASE WHEN t.topicid=',' then (case when t.table_name='zbxx' then ',a,b,c,d,e,f,g,h,' when t.table_name='xmxx' then ',i,j,k,' end ) else t.topicid end as topicid

from info.v_member_my t,info.v_member_my_info i

where i.my_id='1'

and t.member_id=i.member_id and t.sign = 0

and length(t.cust_email)>3

)

4.最后总结下mysql 中CONCAT_WS和CONCAT的区别:

因为mysql中不能像oracle那样使用管道符||在sql中拼接字符串,但是可以使用CONCAT或者CONCAT_WS函数来实现拼接的目的。

MySQL字符串处理函数concat_ws()和MySQL字符串处理函数concat()类似,但是处理的字符串不太一样,concat_ws()函数, 表示concat with separator,即有分隔符的字符串连接 ,当然分隔符为空的情况就更类似于concat()。

1)如连接后以逗号分隔

MariaDB [(none)]> select concat_ws(',','11','he2','liu');

+---------------------------------+

| concat_ws(',','11','he2','liu') |

+---------------------------------+

| 11,he2,liu |

+---------------------------------+

2)连接后以空分割,可以理解为没有分隔。非常类似于concat()

MariaDB [(none)]> select concat_ws('','11','he2','liu');

+--------------------------------+

| concat_ws('','11','he2','liu') |

+--------------------------------+

| 11he2liu |

+--------------------------------+

MariaDB [(none)]> select concat('','11','he2','liu');

+-----------------------------+

| concat('','11','he2','liu') |

+-----------------------------+

| 11he2liu |

+-----------------------------+

1 row in set (0.00 sec)

3)concat_ws()和concat()不同的是, concat_ws()函数在执行的时候,不会因为NULL值而返回NULL.

MariaDB [(none)]> select concat_ws(',','11','22',NULL);

+-------------------------------+

| concat_ws(',','11','22',NULL) |

+-------------------------------+

| 11,22 |

+-------------------------------+

1 row in set (0.00 sec)

MariaDB [(none)]> select concat_ws('','11','22',NULL);

+------------------------------+

| concat_ws('','11','22',NULL) |

+------------------------------+

| 1122 |

+------------------------------+

1 row in set (0.00 sec)

MariaDB [(none)]> select concat('11','22',NULL);

+------------------------+

| concat('11','22',NULL) |

+------------------------+

| NULL |

+------------------------+

1 row in set (0.00 sec)

oracle和mysql还是有很多不一样的地方,去ioe的过程还是很艰难的。

mysql中 translate_mysql实现oracle的decode和translate以及管道符拼接相关推荐

  1. mysql 类似 oracle connect by,mysql中实现相仿oracle的SYS_CONNECT_BY_PATH功能

    mysql中实现类似oracle的SYS_CONNECT_BY_PATH功能 oracle中的SYS_CONNECT_BY_PATH函数为开发带来了便利,mysql中如何实现类的功能呢? DELIMI ...

  2. mysql中varchar与oracle中varchar2区别

    一.字符与字节关系 一)"字节"的定义 字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位. (二)"字符"的定义 ...

  3. mysql中if在oracle怎么用_MySql和Oracle的使用

    本文档是一个记录文档,会不定时更新使用过程中遇到的差异问题 本文档记录MySql和Oracle在使用中要注意的问题,也包括两者使用上的差异问题 字符串拼接函数 CONCAT MySql MySql的 ...

  4. mysql中if在oracle怎么用_mysql和oracle的mybatis操作

    1.Oracle.MySQL插入时返回下一个主键的操作 Xml代码 Oracle: SELECT SEQ_ROLE.NEXTVAL AS ID FROM DUAL insert into ROLE(I ...

  5. mysql中的scn,oracle数据库SCN概念

    目录 1.SCN的介绍 2.SCN的工作机制 3.SCN的增加 4.其他的SCN 5测试 6小结 7问题 1.SCN的介绍 Oracle中的SCN有下面几种: 1)系统检查点scn(v$databas ...

  6. mysql sys_connect_by_path_mysql中实现相仿oracle的SYS_CONNECT_BY_PATH功能

    mysql中实现类似oracle的SYS_CONNECT_BY_PATH功能 oracle中的SYS_CONNECT_BY_PATH函数为开发带来了便利,mysql中如何实现类的功能呢? DELIMI ...

  7. oracle触发器比较,Oracle使用触发器和mysql中使用触发器的比较

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  8. ORACLE实现MySQL中substring_index函数功能

    目录 MySQL中substring_index函数 ORACLE涉及函数 实现函数源码 MySQL中substring_index函数 substring_index(string, delimit ...

  9. mysql 伪表查询语句_MySql系列05:MySql中DQL查询操作

    1.表的准备 准备四张表: dept(部门表).emp(员工表).salgrade(薪资等级表).bonus(奖金表) create table DEPT( DEPTNO int(2) not nul ...

最新文章

  1. 【跃迁之路】【535天】程序员高效学习方法论探索系列(实验阶段292-2018.07.25)...
  2. 图解SQL Server 存储过程教程一
  3. 渲染器跑分_这一次会挤牙膏吗?9400F/10400跑分对比
  4. c语言中指,浅析C语言中指与数组.doc
  5. 采用MiniProfiler监控EF与.NET MVC项目
  6. Ngnix安装的几种常用方式
  7. 技术社区_如何加入技术社区
  8. C#实现较为实用的SQLhelper
  9. c语言线性顺序表,C语言程序——线性顺序表.doc
  10. 盘点开发者最爱的 IntelliJ 插件 Top 10
  11. python怎么读取excel-python怎么读取excel表格
  12. 【翻译】Geometric Features-Based Parking Slot Detection
  13. virtuebox 安装VBoxGuestAdditions,ubuntu下设置文件共享
  14. Freeimage-3.18.0编译(静态库)
  15. 前装车载导航搭载率突破50%,谁在领跑背后的导航引擎
  16. 一些软件工程的基础知识
  17. 华为atn950b指导手册_全新原包装华为ATN950B 整机 传输设备
  18. win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
  19. char类型与varchar类型的区别
  20. 题解报告——聪聪与可可

热门文章

  1. highchars隐藏图例或者设置图例位置
  2. 最新USBPD3.1 快充协议
  3. 《A Gentle Introduction to Graph Neural Networks》要点
  4. 橙色云CDS案例分享|非标PLC自动化设备远程调试运维
  5. CryoEM - 使用 3DMod (IMOD) 评估蛋白质三维结构的质量
  6. EMV规范学习与研究(十)——卡片行为分析
  7. Python:记录一次pycharm启动python程序报验证警告问题及解决方案
  8. 华为OD机试 - 数组组成的最小数字(C 语言解题)【独家】
  9. 又一国家级测速软件上线:绿色免费,支持5G 和千兆测速
  10. 防盗报警应用范围及未来市场发展分析