在函数名称上拆分SQL语句,但在Python中保留定界符

东京

假设我具有string包含从SELECT子句中提取的SQL语句的以下内容(实际上,这是一个巨大的SQL语句,其中包含数百个此类语句);

  SUM(case when(A.money-B.money>1000
                and A.unixtime-B.unixtime<=890769
                and B.col10 = "A"
                and B.col11 = "12"
                and B.col12 = "V") then 10
      end) as finalCond0,
  MAX(case when(A.money-B.money<0
                and A.unixtime-B.unixtime<=6786000
                and B.cond1 = "A"
                and B.cond2 = "4321"
                and B.cond3 in ("E", "F", "G")) then A.col10
        end) as finalCond1,
  SUM(case when(A.money-B.money>0
                and A.unixtime-B.unixtime<=6786000
                and B.cond1 = "A"
                and B.cond2 = "1234"
                and B.cond3 in ("A", "B", "C")) then 2
      end) as finalCond2    

我怎么能在功能拆分此查询(即SUMMAXMINMEAN等),这样我可以提取一次查询,但不删除分隔符(在这种情况下SUM)?

因此,所需的输出将是类似于以下内容的字符串:

  SUM(case when(A.money-B.money>0
                and A.unixtime-B.unixtime<=6786000
                and B.cond1 = "A"
                and B.cond2 = "1234"
                and B.cond3 in ("A", "B", "C")) then 2
      end) as finalCond2

PS:出于演示目的,我提供了某种缩进,但实际上,这些语句之间用逗号分隔,这意味着原始格式中不会出现空格或新行。

马丁·彼得斯(Martijn Pieters)

您不能在此处使用正则表达式,因为SQL语法无法形成正则模式,因此可以与Pythonre引擎匹配您实际上必须将字符串解析为令牌流或语法树。SUM(...)毕竟,可以包含多种语法,包括子选择。

sqlparse可以做到这一点,即使它的文档不足,并且对外部使用不太友好

重用walk_tokens我在链接到的另一篇文章中定义功能:

from collections import deque
from sqlparse.sql import TokenList

def walk_tokens(token):
    queue = deque([token])
    while queue:
        token = queue.popleft()
        if isinstance(token, TokenList):
            queue.extend(token)
        yield token

SELECT然后标识符列表中提取最后一个元素是:

import sqlparse
from sqlparse.sql import IdentifierList

tokens = sqlparse.parse(sql)[0]
for tok in walk_tokens(tokens):
    if isinstance(tok, IdentifierList):
        # iterate to leave the last assigned to `identifier`
        for identifier in tok.get_identifiers():
            pass
        break

print(identifier)

演示:

>>> sql = '''\
...   SUM(case when(A.money-B.money>1000
...                 and A.unixtime-B.unixtime<=890769
...                 and B.col10 = "A"
...                 and B.col11 = "12"
...                 and B.col12 = "V") then 10
...       end) as finalCond0,
...   MAX(case when(A.money-B.money<0
...                 and A.unixtime-B.unixtime<=6786000
...                 and B.cond1 = "A"
...                 and B.cond2 = "4321"
...                 and B.cond3 in ("E", "F", "G")) then A.col10
...         end) as finalCond1,
...   SUM(case when(A.money-B.money>0
...                 and A.unixtime-B.unixtime<=6786000
...                 and B.cond1 = "A"
...                 and B.cond2 = "1234"
...                 and B.cond3 in ("A", "B", "C")) then 2
...       end) as finalCond2
... '''
>>> tokens = sqlparse.parse(sql)[0]
>>> for tok in walk_tokens(tokens):
...     if isinstance(tok, IdentifierList):
...         # iterate to leave the last assigned to `identifier`
...         for identifier in tok.get_identifiers():
...             pass
...         break
...
>>> print(identifier)
SUM(case when(A.money-B.money>0
                and A.unixtime-B.unixtime<=6786000
                and B.cond1 = "A"
                and B.cond2 = "1234"
                and B.cond3 in ("A", "B", "C")) then 2
      end) as finalCond2

identifiersqlparse.sql.Identifier实例,但是再次将其转换为字符串(可以print(),或者也可以使用str())再次为该部分提供输入SQL字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

XSLT:在文本定界符上拆分元素内容,保留元素

来自分类Dev

Excel问题:空行上的行拆分/定界符

来自分类Dev

Ruby:如何在保留定界符的同时在正则表达式上拆分字符串?

来自分类Dev

从SQL字符串拆分Multipile定界符

来自分类Dev

在定界符处拆分长SQL表达式

来自分类Dev

拆分字符串保留一些定界符,但删除另一个定界符

来自分类Dev

Python重新编译,在保留定界符的同时将字符串拆分为两个

来自分类Dev

分解字符串并在php中保留定界符/分隔符

来自分类Dev

分割字符串并在JavaScript加条件中保留定界符

来自分类Dev

Python:在(sub)字符串定界符上分割,但在括号内时不分割吗?

来自分类Dev

python使用多定界符分割字符串并保留这些定界符python--快速方法

来自分类Dev

正则表达式(Python)-删除以定界符开头的行并保留其他定界符

来自分类Dev

C#使用Regex.Split拆分大字符串。必须保留定界符

来自分类Dev

如何拆分字符串并使用boost :: split保留定界符?

来自分类Dev

如何在拆分定界符RegExp的任一侧保留内容?

来自分类Dev

C#使用Regex.Split拆分大字符串。必须保留定界符

来自分类Dev

带多个定界符的拆分列

来自分类Dev

拆分R列,不带定界符

来自分类Dev

T-SQL函数将带有两个定界符的字符串拆分为表中的列分隔符

来自分类Dev

通过c中的多个定界符将字符串拆分为数组的函数

来自分类Dev

在keyevent上更改定界符

来自分类Dev

在定界符上分割长行

来自分类Dev

使用默认定界符与用户定义定界符进行字符串拆分

来自分类Dev

使用保存定界符将字符串按多个定界符进行拆分

来自分类Dev

使用各种定界符分割字符串,同时保留定界符

来自分类Dev

Javascript正则表达式拆分但保留定界符的一部分

来自分类Dev

如何拆分定界符字符串并将其存储为python中的数组?

来自分类Dev

Python:如何在字符串拆分中包含定界符?

来自分类Dev

拆分字符串而不删除python中的定界符

Related 相关文章

  1. 1

    XSLT:在文本定界符上拆分元素内容,保留元素

  2. 2

    Excel问题:空行上的行拆分/定界符

  3. 3

    Ruby:如何在保留定界符的同时在正则表达式上拆分字符串?

  4. 4

    从SQL字符串拆分Multipile定界符

  5. 5

    在定界符处拆分长SQL表达式

  6. 6

    拆分字符串保留一些定界符,但删除另一个定界符

  7. 7

    Python重新编译,在保留定界符的同时将字符串拆分为两个

  8. 8

    分解字符串并在php中保留定界符/分隔符

  9. 9

    分割字符串并在JavaScript加条件中保留定界符

  10. 10

    Python:在(sub)字符串定界符上分割,但在括号内时不分割吗?

  11. 11

    python使用多定界符分割字符串并保留这些定界符python--快速方法

  12. 12

    正则表达式(Python)-删除以定界符开头的行并保留其他定界符

  13. 13

    C#使用Regex.Split拆分大字符串。必须保留定界符

  14. 14

    如何拆分字符串并使用boost :: split保留定界符?

  15. 15

    如何在拆分定界符RegExp的任一侧保留内容?

  16. 16

    C#使用Regex.Split拆分大字符串。必须保留定界符

  17. 17

    带多个定界符的拆分列

  18. 18

    拆分R列,不带定界符

  19. 19

    T-SQL函数将带有两个定界符的字符串拆分为表中的列分隔符

  20. 20

    通过c中的多个定界符将字符串拆分为数组的函数

  21. 21

    在keyevent上更改定界符

  22. 22

    在定界符上分割长行

  23. 23

    使用默认定界符与用户定义定界符进行字符串拆分

  24. 24

    使用保存定界符将字符串按多个定界符进行拆分

  25. 25

    使用各种定界符分割字符串,同时保留定界符

  26. 26

    Javascript正则表达式拆分但保留定界符的一部分

  27. 27

    如何拆分定界符字符串并将其存储为python中的数组?

  28. 28

    Python:如何在字符串拆分中包含定界符?

  29. 29

    拆分字符串而不删除python中的定界符

热门标签

归档