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

2023-03-14 16:49:27 +08:00
 caroline1022

比如

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 语句相当随机,其中有备注或者语句内容本身有半边括号的情况

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

780 次点击
所在节点    问与答
3 条回复
lookStupiToForce
2023-03-14 17:21:17 +08:00
你有没有意识到,你在实现一个简易的解析器( parser )

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

比如我们来看看 python 里的 sqlparse
zhuanlan[.]zhihu[.]com/p/279297051
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
2023-03-14 21:28:53 +08:00
可以考虑使用 antlr4 进行 SQL 的语法解析,然后直接得到内容。这样就从根本上保证了匹配的准确性。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/923950

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX