sql嵌套选择解析

时间:2011-09-30 08:32:51

标签: python parsing

情况: 我有几个SSRS报告,我需要记录sql代码。 为此,我需要一次又一次地以完全相同的方式格式化代码。

问题: 在我的一些报告中,我有像

这样的结构
select outer
from (
select outin
from (
select inner
from (
select innerMax
from
)z
where
)x
where dateadd(d,12,getdate())
)y
where

我希望结果是

select outer
from (
    select outin
    from (
        select inner
        from (
            select innerMax
            from
        )z
        where
    )x
    where dateadd(d,12,getdate())
)y
where

但我在缩进嵌套选择

方面遇到了问题

如果你能给我提供例子,我真的很感激。 我使用了分裂,正则表达式,子串,......

问候

1 个答案:

答案 0 :(得分:1)

这比你想象的要复杂:split,substring和regex不足以可靠地解决这个问题。考虑SQL代码中的注释或字符串文字,它们可能包含看起来像SQL的文本或包含会弄乱缩进级别的括号。

更好的方法是使用SQL解析器。这是一个python-sqlparse的演示:

#!/usr/bin/env python
import sqlparse

sql = """
select outer
from (
select outin
from (
select inner
from (
select innerMax
from
)z
where
)x
where dateadd(d,12,getdate())
)y
where
"""

print sqlparse.format(sql, reindent=True)

将打印:

select outer
from
  (select outin
   from
     (select inner
      from
        (select innerMax
         from)z
      where)x
   where dateadd(d,12,getdate()))y
where