这是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处理这个问题?我的问题不明确吗?
答案 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
(所有未经测试的)