前言
本篇记录mysql与民航电子数据库select语句的语法差异
语法差异
1、cae:date_add(date, INTERVAL num HOUR)函数中"num"不能为字段,只能是数值
2、cae:date_add()函数中不能再使用函数或运算表达式,但可以使用"+"号来对日期进行"天数"新增,默认新增单位:天数
SELECT date_add(ddate, INTERVAL IFNULL(receiveOverTime, 1) HOUR ) as overTime FROM t_order_info
使用"+"号来对日期进行"天数"新增,使用(小时数 / 24)来对日期进行"小时"新增,案例如下
SELECT ddate , ddate + IFNULL(receiveOverTime,1) as ddateAddDay , ddate + (1 / 24) as ddateAddHour FROM t_order_info
3、cae日期可以使用"+"号来对日期进行"天数"新增,默认新增单位:天数
SELECT ddate , ddate + IFNULL(receiveOverTime,1) as ddateAddDay , ddate + (1 / 24) as ddateAddHour FROM t_order_info
4、mysql的"日期"类型支持数值运行:"createTime > 0、createTime = 0",caedb不行
mysql:SELECT createTime FROM t_test WHERE createTime > 0
caedb:SELECT createTime FROM t_test WHERE UNIX_TIMESTAMP(createTime) > 0
5、mysql进行多表查询时可以多一个括号,cae不行
mysql:
SELECT
a.c AS outQty,
b.c AS inQty,
( CASE 1 WHEN 1 = 1 THEN a.c + b.c END ) AS qty
FROM
(
( SELECT count( ID ) AS c FROM t_sms_send WHERE vdnId = 1 AND createDate >= CURDATE() ) AS a,
( SELECT count( ID ) AS c FROM t_sms_receive WHERE vdnId = 1 AND createDate >= CURDATE() ) AS b
)
caedb:
SELECT
a.c AS outQty,
b.c AS inQty,
( CASE 1 WHEN 1 = 1 THEN a.c + b.c END ) AS qty
FROM
-- 这个括号要去掉 (
( SELECT count( ID ) AS c FROM t_sms_send WHERE vdnId = 1 AND createDate >= CURDATE() ) AS a,
( SELECT count( ID ) AS c FROM t_sms_receive WHERE vdnId = 1 AND createDate >= CURDATE() ) AS b
-- 这个括号要去掉)
6、mysql的"case when"语句"then"后边可以是表达式,cae只能是固定值
7、cae:在xml中date_add()函数无法为#{xxx}注入参数值,本例中#{hour}的值会是NULL
select xxx from t_xxx_xxx WHERE date_add(overTime, interval #{hour} HOUR) > #{now}
8、cae在group by分组后进行order by,只能再套一层select
9、cae如果是框架sharingjdbc + caedb,查询时字段名称支持双引号",如果没有shardingjdbc,则字段名称不支持双引号
10、cae:进行表连接时,表连接条件的字段类型必须一致,本例中:ext.chGroup为varchat类型,cg.id为integer类型
SELECT
count( 0 )
FROM
t_icip_base_extension ext
LEFT JOIN t_icip_base_channelgroup cg ON ext.chGroup = cg.id
WHERE
ext.VDN = 1
改为
SELECT
count( 0 )
FROM
t_icip_base_extension ext
LEFT JOIN t_icip_base_channelgroup cg ON ext.chGroup = concat(cg.id,'')
WHERE
ext.VDN = 1
11、cae:在有group by分组统计的语句中,selete输出表达式含有非分组统计项,对应mysql的sql_mode=only_full_group_by
cae可以通过sql来查看分组模式:show def_group_by_mode
调整分组模式解决该问题:set def_group_by_mode to 1
12、select返回的字段名称如果要区分大小写,定义名称时要加上单引号
select ID as 'id',WorkNO as 'workNo' from t_sys_users
注:使用mybatis查询返回的结果对象如果是JSONObject、Map,则需要指定别名大小写,如果是实体类则不需要区分大小写,字段名称会以实体类为准
13、程序报错:无法自动获取数据库类型,请通过 helperDialect 参数指定!
原因:是使用PageHelper.startPage(pageNo, pageSize)导致
解决:在application配置文件添加pagehelper.helper-dialect属性即可
14、UNIX_TIMESTAMP()函数使用有差异,如果不传参数,cae需要加上sysdate参数,并且返回的是13位的时间戳,而mysql返回的是10位的时间戳
caedb:Select UNIX_TIMESTAMP(sysdate) as 'timeStamp'
mysql:Select UNIX_TIMESTAMP() as 'timeStamp'
15、IF()函数使用有差异,cae不支持表达式,需要使用表达式时可以用cae when代替
mysql、cae都支持:select if(false,1,0)
mysql、cae都支持:select if(false,true,false)
mysql支持、cae不支持:select if(false,1=1,0=0)