我有一个 SQL 查询字符串作为输入。我需要获取查询使用的所有表(例如 FROM table 或 table1 INNER JOIN table2)。但查询不遵守任何标准。所以我的问题是是否有任何方法来格式化查询,以便搜索这些表名更容易。
我现在的方法是搜索关键字 from 和 join 并获取关键字之后的任何行(或者在 join 的情况下之前),但是查询中有异常(exception),其中 from 没有换行符之后我必须像这样对待每一个异常。我认为正则表达式不起作用,因为虽然表名称是 {schema_name.table_name} ,但也有类似的列。
for row in text:
to_append = None
split_row = row.strip('\r').strip(' ').strip('\r').split(' ')
if split_row[-1].lower() == "from" and len(split_row) > 1:
from_indexes.append(text.index(row))
if ("join" in split_row or "JOIN" in split_row) and (split_row[-1] != "join" and split_row[-1]
!= "JOIN"):
for ind in range(len(split_row)):
if split_row[ind].lower() == "join":
to_append = split_row[ind + 1:]
row = split_row[:ind + 1]
row = ' '.join(row)
rows.append(row.strip('\r').strip(' ').strip('\t'))
if to_append is not None:
rows.append(' '.join(to_append))
所以我正在寻找一些可以标准化 SQL 查询的方法,或者寻找另一种从查询中提取表名的方法。
最佳答案
我认为更直接的方法是使用正则表达式:
import re
sql = """select t1.*, t2.y, sq.z, table3.q from table1 t1 join
table2 t2 on t1.x = t2.x left join
(select 5 as x, 9 as z) sq JOIN
table3 on sq.x = table3.x
;"""
matches = re.findall(r'(\s+(from|join)\s+)(\w+)', sql, re.DOTALL|re.IGNORECASE)
for match in matches:
print(match[2])
请注意,它不会将(选择 5 作为 x,9 作为 z) 视为表格。
关于python - 格式化 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56733338/