gpt4 book ai didi

python - 如何从sql查询中提取列名

转载 作者:行者123 更新时间:2023-11-29 10:10:24 25 4
gpt4 key购买 nike

我只从这样的查询中提取了列字段

query_split = [query[query.find("select") + len("select"): query.find("from")]]

我得到一个像这样的字符串

 query_split = [' service,count(*) as count,round(sum(mrp),2) as sale ']

我想要一个看起来像这样的列表

[' service','count(*) as count','round(sum(mrp),2) as sale']

这是因为我想获取列名称列表

['service','count','sale']

我尝试过其他方法,例如

for file in reader(query_split):
print(file)

给我输出

[' service', 'count(*) as count', 'round(sum(mrp)', '2) as sale ']

当我在查询中使用 round(sum(mrp),2) 类型操作的测试用例时,以下函数在此时失败

def get_column_name(query):
"""
Extracts the column name from a sql query
:param query: str
:return: column_name
list: Column names which that query will fetch
"""
column_name=[]
query_split = query[query.find("select") + len("select"): query.find("from")]
for i in query_split.split(','):

if "as" in i:
column_name.append(i.split('as')[-1])
else:
column_name.append(i.split(' ')[-1])
return column_name

最佳答案

您的问题是这里使用的 SQL 具有嵌套结构。

最可能最简洁的解决方案是拥有一个能够理解 MySQL 方言的 SQL 解析器。可以说,使用 ANTLR 可以最轻松地完成此任务;你可以找到MySQL grammar here和一个quick guide here如果你好奇的话。

要使用正则表达式解决此问题,我们需要在匹配模式中使用递归正则表达式来考虑平衡括号,如下所示:

[^,]+(\((?>[^()]++|(?1))*+\))[^,]+|([^(),]+(?:,|$))

说明:

  • [^,]+(\((?>[^()]++|(?1))*+\))[^,]+ 用于匹配对的递归正则表达式() 以及其间的所有内容(包括逗号)由否定字符类包围,该字符类匹配除逗号之外的所有内容。
  • ([^(),]+(?:,|$)) 匹配常规列

Demo

示例代码:

import regex as re
regex = r"[^,]+(\((?>[^()]++|(?1))*+\))[^,]+|([^(),]+(?:,|$))"
test_str = "service,count(*) as count,round(sum(mrp),2) as sale,count(*) as count2,round(sum(mrp),2) as sale2"
matches = re.finditer(regex, test_str, re.MULTILINE)
result = [match.group() for match in matches]

输出:

['service,', 'count(*) as count', 'round(sum(mrp),2) as sale', 'count(*) as count2', 'round(sum(mrp),2) as sale2']

由于我们使用 PCRE 正则表达式功能,您将需要安装 Python 的替代方案 regex包来运行代码。祝你好运。

关于python - 如何从sql查询中提取列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51075852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com