pyparsing可选子字段

时间:2011-08-11 20:52:17

标签: python pyparsing

这是pyparsing, Each, results name的延续。我在pyparsing方面取得了很大的成功,但是在解析SQL order by clauses时我遇到了困难。问题是任何字段都可以设置为升序或降序。

因此,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 1}}。

我很乐意将输出视为['c asc', 'd desc'],只要我仍然能够获得columnNameList

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

1 个答案:

答案 0 :(得分: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

(所有未经测试的)