开发者社区> 问答> 正文

format 后sql不满足语法格式

druid 版本 1.2.9 原本SQL:select * from mc_job a inner join (mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id ; //能正确执行.SQLUtils.format(sql, DbType.postgresql)格式化后的sql: SELECT * FROM mc_job a INNER JOIN ((mc_role b INNER JOIN mc_source c ON b.id = c.id) AS tem2) ON tem2.user_id = a.id; //不能执行 格式化时在inner join 的右边加()时把别名也包进去了. 如果我将原本的sql改为:select * from mc_job a inner join (select * from mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id ; 格式化后为: SELECT * FROM mc_job a INNER JOIN ( SELECT * FROM mc_role b INNER JOIN mc_source c ON b.id = c.id ) tem2 ON tem2.user_id = a.id; 这样格式化后是没有问题的.我能提供的信息就这些了,大佬看下哪的问题吧.

今天发现mysql也有一样的问题,类似于select * from t1 inner join (t2 inner join t3) as tt2 on t1.id = tt2.id ...这样的sql也会format成错误的sql语句,错误的现象和我提出的pgsql的一样.不知道大佬你的这次fix能不能覆盖到mysql.

原提问者GitHub用户capitalR

展开
收起
山海行 2023-07-05 18:02:57 101 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在您提供的例子中,原始 SQL 语句中使用了子查询,而在使用 SQLUtils.format 方法进行格式化时,Druid SQL 工具库按照标准 SQL 的语法规则将子查询转换为一个表,这个表可以拥有别名。在这种情况下,如果您想要保留子查询的原始语法结构,您可以将原始 SQL 语句中的子查询括号部分保留,并在进行格式化时指定保留子查询的选项。

    2023-07-30 20:48:24
    赞同 展开评论 打赏
  • 即在使用 SQLUtils.format 方法将 SQL 语句格式化时,如果在 INNER JOIN 的右侧使用了括号,并在括号内使用了别名,那么格式化后的 SQL 语句会出现错误。

    这个问题可能是由于 SQLUtils.format 方法在处理这种情况时存在一些逻辑上的限制,导致别名被错误地包含在括号内。

    2023-07-09 10:11:37
    赞同 展开评论 打赏
  • 已经修复了 但是没有被merge 如果比较着急的话拉我的分支自己打个包吧

    原回答者GitHub用户ShenFeng312

    2023-07-06 10:42:09
    赞同 展开评论 打赏
  • 很抱歉你遇到了这个问题。根据你的描述,我了解到在使用Druid版本1.2.9时,SQLUtils.format方法在格式化SQL语句时可能会出现问题。原始的SQL语句包含内连接以及别名,并且在格式化后,生成的SQL语句中将别名也包含在内。

    你提供的信息是有限的,但是我可以尝试给出一些解决方案。对于你的第一个例子,如果你将原始的SQL语句修改为在内连接的括号里加入"SELECT * FROM ...",然后在别名之后添加空格,即类似于:

    select * from mc_job a inner join (select * from mc_role b inner join mc_source c on b.id = c.id) as tem2 on tem2.user_id = a.id;
    

    那么执行SQLUtils.format(sql, DbType.postgresql)方法后,生成的格式化SQL语句应该是正确的:

    SELECT * FROM mc_job a INNER JOIN (
        SELECT * FROM mc_role b INNER JOIN mc_source c ON b.id = c.id
    ) tem2 ON tem2.user_id = a.id;
    

    至于你提到的MySQL上的类似问题,由于我是基于OpenAI的ChatGPT模型,我无法进行具体的实验来验证修复是否适用于MySQL。然而,如果Druid的修复是一个通用的修复,那么它应该可以解决类似的问题,不论数据库类型是什么。

    最好的解决方案是尝试更新Druid到最新版本,看看是否修复了这个问题。如果问题仍然存在,请向Druid社区或开发团队报告该问题,以便他们能够提供更具体的帮助和支持。

    2023-07-05 19:07:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
AnalyticDB基础版:云原生My SQL 敏捷数仓 立即下载
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
时序数据库TSDB的SQL与流计算 立即下载