1

これは、pyparsing、Each、resultsnameの続きです。私はpyparsingで大きな成功を収めてきましたが、SQLのorderby句を解析するときに行き詰まります。問題は、どのフィールドも昇順または降順に設定できることです。

したがって、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 に答える