Oracle语句转为Mysql语句
Oracle的部分语法在Mysql中是不兼容的,本文是记录在语法转换中的一些方法心得,如有错误,还请指教。
如有补充,请评论区赐教! 持续更新中。。。
1. nvl() 方法的转化
nvl(表达式1,表达式2) : 若表达式1为空值,则返回表达式2的值,否则返回表达式1的值。
注意: 表达式1和表达式2的数据类型必须是同一个类型。
在mysql中等价方法 : ifnull(expression, alt_value)
参数 | 描述 |
---|---|
expression | 必须,要测试的值 |
alt_value | 必须,expression 表达式为 NULL 时返回的值 |
select nvl(stu_sex,'男') from stu_info; #oracle
select ifnull(stu_sex, '男') from stu_info; #mysql
2. to_char() 方法的转化
select to_char(zi_duan,'fm9999.00') from test_table; # orcal
# 其作用也就是表示左边最小为1位(个位),最大3位(百位),有两位小数
# 在mysql中完全可以用decimal(p,m)来控制有效字数的精度,用format来保留小数点后面的位数
select format(zi_duan,2) from test_table; #mysql
对于’fm9990.00’的说明 :
- 0表示:如果参数(double或者float类型)存在数字就显示数字,不存在数字就显示0
- 9表示:如果参数(double或者float类型)存在数字就显示数字,不存在数字就显示空格
- fm表示:将9带来的空格删除
3. 对于嵌套的查询结果不能直接使用,要添加临时表再操作
举个栗子:
select count(1) as cnt from (select * from student );
# 上面这个查询语句在Oracle中是可以正常执行的,但是在MySQL中会报错
# 我们要对统计的查询结果添加临时表,才能正常执行
select count(1) as cnt from (select * from student ) tmp_table;
类似情况也是这样修改。
4. regexp_substr函数的转化
说明: 看网上说mysql 8.0版本可以使用regexp_substr函数,没去考证。但是8.0以下肯定是不能使用的。
第一步理解regexp_substr函数:
REGEXP_SUBSTR (srcstr, pattern, position, occurrence, modifier)
参数 | 描述 |
---|---|
srcstr | 需要进行正则处理的字符串 |
pattern | 进行匹配的正则表达式 |
position | 起始位置,从第几个字符开始正则表达式匹配(默认为1) |
occurrence | 标识第几个匹配组,默认为1 |
modifier | 模式('i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’) |
示例 :
SELECT REGEXP_SUBSTR('1,3,5','[^,]+',1,1,'i') AS str FROM test_table; # 返回1
SELECT REGEXP_SUBSTR('1,3,5','[^,]+',1,3) AS str FROM test_table; # 返回5
因为我遇到的sql语句 position和occurrence都为1,所以选择了 substring_index()函数
字符串截取函数: substring_index(str,delimiter, number)
参数 | 描述 |
---|---|
str | 要处理的字符串 |
delimiter | 分隔符 |
number | 如果 number 是正数,返回第 number 个字符左边的字符串。 如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。 |
SELECT REGEXP_SUBSTR('1,3,5','[^,]+',1,1) AS str FROM test_table; # 返回1 oracle
#等价于
SELECT REGEXP_SUBSTR('1,3,5',',',1) AS str FROM test_table; # 返回1 mysql