2011-08-11 7 views
1

これは続きですpyparsing, Each, results nameです。私はpyparsingで大きな成功を収めてきましたが、SQL order by節を解析するときには止まっています。問題は、いずれのフィールドも昇順または降順に設定できることです。省略可能なサブフィールド

ので、SQLクエリは次のようになります。、ORDER BY c asc, d descような何かのために

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

:私は手探りしてきた、と私が思い付くした最高のがある

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 

これはcが私が注文した最初のもので、ascは私の注文ですが、dには届きません。

私はのように出力しても、そこにはまだcolumnNameListが得られます。

これを処理する方法はありますか。私の質問は不明でしたか?

+0

私は多分あなたは 'columnNameList'を変更したいと思いますか? 'asc/desc'を取るこ​​とができるのはそれが最小限の要素だからです。 – Owen

答えて

1

各orderBy列には、列名とオプションの注文方向があります。複数の列をカンマで区切って指定できます。列の名前と順序の方向が一緒に保持されるように、各列の方向のペアをグループ化する必要があります。コンマで区切られたもののリストは、典型的なもので、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 

(すべての未テスト)

+0

もう一度その日を保存しました。ありがとう! – Hoopes

関連する問題