1

这是pyparsing, Each, results name的延续。我在 pyparsing 方面取得了巨大的成功,但是在按子句解析 SQL order by 时我被卡住了。问题是任何字段都可以设置为升序或降序。

因此,SQL 查询可能如下所示:

SELECT a FROM x WHERE a = b ...
ORDER BY c, d
ORDER BY c asc, d
ORDER BY c asc, d desc
ORDER BY c, d asc

我一直在摸索,我想出的最好的是:

order_dir = oneOf('asc desc', caseless=True)
...
Optional( CaselessKeyword('order by') + columnNameList('order') + Optional(order_dir)('order_dir'))
...

对于类似的东西ORDER BY c asc, d desc,这匹配c我订购的第一件事,并且asc是我的订单目录,但没有到达d.

['c asc', 'd desc']只要我仍然可以进入那里,我很乐意将输出视为类似的东西columnNameList

有没有办法用pyparsing处理这个问题?我的问题不清楚吗?

4

1 回答 1

1

每个 orderBy 列都有一个列名和一个可选的排序方向。可以有多个列,以逗号分隔。您应该对每个列方向对进行分组,以便将列名称和顺序方向保持在一起。用逗号分隔的事物列表对于 pyparsing 来说是很自然的delimitedList

尝试将您的条款更改为:

Optional( CaselessKeyword('order by') + 
        delimitedList(Group(columnNameList('order') + 
                            Optional(order_dir, default="asc")('order_dir')))('orderByColumns')
        )

这将为您提供一个名为“orderByColumns”的字段,其中包含一系列对。即使 asc/desc 限定符被省略,Optional 类的默认字段也会插入“asc”。将这些列阅读为:

if result.orderByColumns:
    for ocol in result.orderByColumns:
        print "Order by %(order)s (%(order_dir)s)" % ocol

(所有未经测试)

于 2011-08-11T22:56:05.767 回答