MyBatis快速将MySQL转换成Oracle语句

1、分页

  1. mysql: LIMIT 0,1
  2. oracle: ROWNUM <= 1

情景①:mysql中不含ORDER BY

-- mysql
SELECT * FROM 表名 LIMIT 1

-- oracle
SELECT * FROM 表名  WHERE ROWNUM <= 1

情景②:mysql中含ORDER BY

-- mysql
SELECT * FROM 表名 ORDER BY 字段名 DESC LIMIT 1 


-- oracle
SELECT * FROM ( 
    SELECT TMP.*, ROWNUM ROW_ID FROM ( 
        SELECT * FROM 表名 ORDER BY 字段名 DESC
    ) TMP WHERE ROWNUM <= 1 ) 
WHERE ROW_ID > 0;

温馨小知识:SQL SELECT语句执行顺序

  1. FROM子句组装来自不同数据源的数据
  2. WHERE子句基于指定的条件对记录进行筛选
  3. GROUP BY子句将数据划分为多个分组
  4. 聚集函数进行计算
  5. HAVING子句筛选分组
  6. 计算所有表达式
  7. ORDER BY对结果进行排序

2、oracle中字段名不能使用符号 " ` " 包括

-- mysql
SELECT `字段名` FROM 表名

-- oracle
SELECT 字段名 FROM 表名

3、字符串拼接

注: Oracle中CONCAT函数只能放两个参数,因此改为 || 拼接

  1. mysql: CONCAT('%', 'xxx' , '%')
  2. oracle: '%' || 'xxx' || '%'
-- mysql
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE CONCAT('%','helloworld','%')

-- oracle
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ('%' || 'helloworld' || '%')

4、date类型时间转10位时间戳

  1. mysql: UNIX_TIMESTAMP
  2. oracle: ORACLE_TO_UNIX (注:此函数为步骤三中手动创建的,并非oracle自带哦!)

5、字段名Oracle关键字需加上双引号

温馨小提示: 字段名需大写,如果Java实体类对应字段为小写,映射的别名注意需保持原本小写与之对应 ~

例如:

  1. level -> "LEVEL"
  2. user -> "USER"
  3. number -> "NUMBER"
  4. desc -> "DESC"
  5. date -> DATE

6、判断是否为 NULL: 如果x为NULL,则返回value,否则返回x值本身

  1. mysql: IFNULL(x, value)
  2. oracle: NVL(x, value)

7、日期时间互换

前mysql,后oracle

  1. 字符串类型转时间类型: STR_TO_DATE -> TO_DATE
  2. 时间类型转指定字符串类型: DATE_FORMAT -> TO_CHAR
  3. 获取系统当前时间: NOW() -> SELECT SYSDATE FROM DUAL
-- 时间类型转指定字符串类型
SELECT DATE_FORMAT( NOW(),'%Y-%m-%d %H:%i:%s');             -- mysql
SELECT TO_CHAR( SYSDATE,'yyyy-MM-dd HH24:mi:ss') FROM DUAL; -- oracle

-- 字符串类型转时间类型
SELECT STR_TO_DATE( NOW(), '%Y-%m-%d %H');             -- mysql
SELECT TO_DATE( '2020-01-09', 'yyyy-MM-dd') FROM DUAL; -- oracle 【 注:oracle中前者字符串时间的格式需与后者转换格式相同哦~ 】

-- 获取系统当前时间
SELECT NOW(); -- mysql
SELECT SYSDATE + 8/24 FROM DUAL; -- oralce 【注:如果服务器时间没有相差8小时则无需加上`8/24`】

-- mysql
SELECT YEAR( NOW() );     -- 求年份
SELECT QUARTER( NOW() );  -- 求季度
SELECT MONTH( NOW() );    -- 求月份

-- oracle
SELECT TO_CHAR(SYSDATE, 'Q') FROM DUAL; -- 求季度

另外这里给出小编所用到的时间标识符格式

-- 前:mysql             后:oracle
"%Y-%m-%d %H:%i:%S"     "yyyy-MM-dd HH24:mi:ss"
"%Y-%m-%d %H:%i:%s"     "yyyy-MM-dd HH24:mi:ss"
"%Y-%m-%d %H:%i"        "yyyy-MM-dd HH24:mi"
"%Y-%m-%d %H"           "yyyy-MM-dd HH24"
"%Y-%m-%d %h"           "yyyy-MM-dd HH"
"%Y-%m-%d"              "yyyy-MM-dd"
"%Y-%m"                 "yyyy-MM"
"%Y"                    "yyyy"
"%H"                    "HH24"
"%k"                    "HH24"

8、判断时   字段类型必须相同

这里注意是必须,可能在oracle版本不同的情况下,老版本不同类型也会查询出来,但建议还是改为相同类型关联,避免以后数据库版本升级出现问题!!!

建议小转大,比如:数字转字符串;并使用CONCAT去修改类型,因为mysql和oracle都支持此函数,并且不会在特殊类型上出现问题 ~

-- ex: `JOIN` 关联表时 两张表的关联`字段类型`必须`相同`
SELECT a.*,b.*
FROM 表1 a
LEFT JOIN 表2 b on a.字符串类型字段 = CONCAT(b.数字类型字段, '')

9、批量插入

-- mysql

    INSERT INTO 表名( `字段名1`, `字段名2`, `字段...`) VALUES
    
        #{item.字段1},#{item.字段2},#{item中的每一个字段名...}
    


-- oracle

    INSERT INTO 表名(字段名1,字段名2,xxx...)
    SELECT A.*
    FROM(
        
            SELECT
                #{item.字段1},#{item.字段2},#{item中的每一个字段名...}
            FROM DUAL
        
    ) A

10、分组 GROUP BY

oracle中GROUP BY分组后,查询出来的所有字段(除分组字段)必须为聚合函数的字段,否则会报错!

解决:

  1. 查询字段改为聚合函数
  2. 使用如下分析函数 OVER (Partition BY ...) 及开窗函数
-- mysql
SELECT 字段名,xxx... FROM 表名 GROUP BY 分组字段

-- oracle
SELECT
    *
FROM (
    SELECT tb.*, ROW_NUMBER ( ) OVER ( PARTITION BY tb.分组字段 ORDER BY tb.排序字段 DESC ) AS result
    FROM (
        SELECT 字段名,xxx... FROM 表名 -- 此处为查询sql,去掉`GROUP BY`分组条件,将分组字段加到上面 【 注:此sql的查询字段中要么全是聚合函数字段,要么都不是! 】
    ) tb
) WHERE result = 1

11、Oracle中表的别名不能用AS, 列的别名可以用AS

why ?:为了防止和Oracle存储过程中的关键字AS冲突的问题

你可能感兴趣的:(Mybatis)