如何从sql查询中提取列名

2024-05-20 17:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我有一根这样的绳子

^{pr2}$

我想要一份这样的清单

[' 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 ']

在mrp类型的查询(2)中,在该类型的sum(取整)测试中失败的情况下

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

Tags: nameinfromlenascountservicemrp
1条回答
网友
1楼 · 发布于 2024-05-20 17:33:50

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

最干净的解决方案是有一个能够理解MySQL方言的SQL解析器。可以说,使用ANTLR可以很容易地完成;如果您好奇,可以找到MySQL grammar herequick guide here。在

要使用正则表达式来实现这一点,我们需要在如下匹配模式中使用递归正则表达式来解释平衡括号:

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

说明

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

Demo

样本代码:

^{pr2}$

输出:

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

因为我们使用的是pcreregex特性,所以您需要安装Python的替代regex包来运行代码。祝你好运。在

相关问题 更多 >