对复杂的sqls进行pyparsing

时间:2015-11-20 15:45:11

标签: python pyparsing

我正在尝试使用pyparsing(lib)来解析和获取SQL语句中使用的所有表/视图。我正在尝试使用这个pyprasing lib提供的select_parser.py代码。

我需要帮助理解我必须对select_parser.py代码进行哪些更改才能实现我在下面提到的输出。

我想解析下面的查询并获取字符串中使用的所有表

Select
        Col 1,
        Col 2
        Col3,
        (select top 1 name from tableX) as Col4,
        col5
from
        table1 a
        left join table2 b on a.id = b.id
        right join table3 c on a.id = c.id
        left join
                (select id from table4) as d
        on c.id = d.id

预期输出

TableX的,表1,表2,表3,表4

1 个答案:

答案 0 :(得分:0)

问题是比较表达式中使用的'identifier'的定义不包含点限定名。

通过更改

中的expr术语来解决此问题
expr_term = (
    CAST + LPAR + expr + AS + type_name + RPAR |
    EXISTS + LPAR + select_stmt + RPAR |
    function_name + LPAR + Optional(delimitedList(expr)) + RPAR |
    literal_value |
    bind_parameter |
    identifier
    )

expr_term = (
    CAST + LPAR + expr + AS + type_name + RPAR |
    EXISTS + LPAR + select_stmt + RPAR |
    function_name + LPAR + Optional(delimitedList(expr)) + RPAR |
    literal_value |
    bind_parameter |
    delimitedList(identifier, delim='.', combine=True)
    )