【发布时间】:2020-12-09 03:25:54
【问题描述】:
如果存在,我需要解析 SQL 语法以获取 FROM 和 WHERE 关键字中的表名(根级别,包括子查询)。例如:
Select *
---
From a
Inner join b on a.c = b.c
---
Where a.o in (
select o
from z
where z.l in (
select l
from a
)
)
Output: From = [a,b], Where = [z,a]
我必须处理所有类型:选择、插入、更新、删除、选择、创建
我有一些想法,例如:
- 标记化 sql 语句
- 查找根 FROM 的索引,如果存在根 WHERE(包括子查询)
- 将查询拆分为 2 部分:从 FROM 到 WHERE 以及从 WHERE 到结束
- 对于每个,使用正则表达式或一些库查找表名
我尝试了一些库:sqlparse、sql_metadata、moz_sql_parser。但是当查询复杂时它会失败。使用 sql_metadata,当评论存在时我会丢失表名,如果使用 sqlparse 删除评论,我会在某处错过')'......等等。
如何拆分 FROM 的一部分和 WHERE 的一部分 如何在每个中查找表名
如何解决?谢谢
【问题讨论】:
-
这个博客应该在某种程度上帮助你,grisha.org/blog/2016/11/14/table-names-from-sql