V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
caroline1022
V2EX  ›  问与答

如何从一个复杂的 with-select SQL 语句中提取出其中 select 的部分?

  •  
  •   caroline1022 · 2023-03-14 16:49:27 +08:00 · 808 次点击
    这是一个创建于 654 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    with t1 as (select * from a1), t2 as(select * from a2)
    select * from t1 left join t2 on t1.t2_id=t2.id
    

    我需要提取到 [ select * from t1 left join t2 on t1.t2_id=t2.id ] 这个部分

    我尝试过使用左右括号计数的方式,但失败了,因为这些 sql 语句相当随机,其中有备注或者语句内容本身有半边括号的情况

    还有什么其他办法可以处理吗?

    3 条回复    2023-03-14 21:28:53 +08:00
    lookStupiToForce
        1
    lookStupiToForce  
       2023-03-14 17:21:17 +08:00
    你有没有意识到,你在实现一个简易的解析器( parser )

    既然叫的出名字,还是这么基础的名字,那么肯定有人实现这种包了

    比如我们来看看 python 里的 sqlparse
    zhuanlan[.]zhihu[.]com/p/279297051
    hooopo
        2
    hooopo  
       2023-03-14 21:02:43 +08:00
    ```
    input: with t1 as (select * from a1), t2 as(select * from a2)
    select * from t1 left join t2 on t1.t2_id=t2.id output the main part of select query, without cte, I want you only give sql, no other normal text
    ```
    给 chatgpt
    greatbody
        3
    greatbody  
       2023-03-14 21:28:53 +08:00
    可以考虑使用 antlr4 进行 SQL 的语法解析,然后直接得到内容。这样就从根本上保证了匹配的准确性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2716 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 11:41 · PVG 19:41 · LAX 03:41 · JFK 06:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.