MySQL静态值SELECT语句语法问题咨询及Oracle语句转MySQL需求
MySQL语法问题与Oracle到MySQL查询转换方案
一、SELECT语句静态值列与*的语法错误分析
在MySQL中,当SELECT列表同时包含静态值列和*时,若将静态值列放在*之前,必须为*指定所属表名,否则会触发1064语法错误。
有效语句示例:
select * , 'apple' from mysql.user
无效报错语句:
select 'app' , * from mysql.user
报错信息:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from mysql.user' at line 1
修正后的有效语句:
为*添加表名限定即可解决:
select 'app' , mysql.user.* from mysql.user
二、Oracle查询转等效MySQL语句
原Oracle查询(中文注释说明):
select '{0}' as 应用ID, -- 对应原FK_APP_ID '{1}' as IP地址, -- 对应原IP '{2}' as Oracle模式名, -- 对应原ORA_SCHEMA username as 登录名, -- 对应原LoginName account_status as 过期状态, -- 对应原IsExpired to_date(expiry_date, 'dd-mm-yy') - to_date(SYSDATE, 'dd-mm-yy') as 到期剩余天数, -- 对应原DaysUntilExpiration profile as 配置文件, -- 对应原Profile expiry_date as 到期日期 -- 对应原ExpiryDate from dba_users
转换后的MySQL语句:
select '{0}' as 应用ID, '{1}' as IP地址, '{2}' as Oracle模式名, `user` as 登录名, -- MySQL中user是保留关键字,需用反引号包裹 case when password_expired = 'Y' then 'EXPIRED' else 'OPEN' end as 过期状态, DATEDIFF(STR_TO_DATE(expiry_date, '%d-%m-%Y'), CURDATE()) as 到期剩余天数, `profile` as 配置文件, -- MySQL中profile是保留关键字,需用反引号包裹 expiry_date as 到期日期 from mysql.user
转换关键点:
- 表映射:Oracle的
dba_users对应MySQL系统表mysql.user - 关键字处理:对MySQL保留关键字
user、profile用反引号`包裹,避免语法错误 - 日期函数替换:
- 用
CURDATE()替代Oracle的SYSDATE获取当前日期 - 用
STR_TO_DATE()替代to_date()解析字符串格式日期,格式符%d-%m-%Y对应日-月-年 - 用
DATEDIFF()直接计算两个日期的天数差,替代Oracle的日期减法写法
- 用
- 状态字段适配:通过
case语句将MySQL的password_expired字段值转换为Oracle类似的状态描述
内容的提问来源于stack exchange,提问作者Sudharsan Simhan
相关产品推荐
相关产品推荐

