繁体   English   中英

pyparsing 可选子字段

[英]pyparsing optional subfield

这是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

我很乐意将 output 当作['c asc', 'd desc']之类的东西,只要我仍然可以在那里获得columnNameList

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

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

尝试将您的条款更改为:

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

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

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

(所有未经测试)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM