2016-08-23 493 views
1

標題幾乎總結了它:我想指定空值是否在我的結果中首先出現或最後出現。在我的特定情況下,我想最後一個降序排序空值,對應於這樣的SQL:Peewee:如何做ORDER BY ... NULLS(FIRST | LAST)?

SELECT id, something, something_else 
FROM mytable 
ORDER BY something DESC NULLS FIRST; 

這是PostgreSQL的語法(這是我使用的是什麼項目)。同樣的問題可能適用於其他數據庫(儘管我不認爲MySQL支持該語法,不知道它是否支持該功能)。當然話說空第一是默認升序(see PostgreSQL docs),所以只有組合DESC NULLS FIRST和NULLS ASC LAST可能是有用的......只是,方便,MySQL的默認值是precisely the opposite.

好像我應該能夠做到這些之一:

MyModel.select().order_by(MyModel.something.desc().nulls_first()) 
MyModel.select().order_by(MyModel.something.desc(nulls_first)) 

我不是Python的用戶,但我無法找到,看起來像它會做我想做的Peewee文檔或源代碼什麼。

當然可能有很多解決方法。下面是我發現的或思想,在實用性遞減順序的那些(對我來說):

  • 使用原始SQL(可在我的情況下,實際的工作,但並沒有那麼大,如果我以後需要的對象)
  • 由別的東西(如函數,我不知道如何與Peewee請執行,或者增加沿着
  • 也許使用UNION結合的一個的this線)派生列排序作假查詢有WHERE?一個有WHERE的人不是NULL? IS NULL ...但在幾個方面似乎有問題,比如我不知道Peewee是否可以做到這一點,並且對於整個事情來說可能仍然是最好的,無論如何,
  • 運行兩個單獨的查詢並且把它們的結果集放到Python中......再一次,聽起來像麻煩,我認爲(額外的開銷,需要1次交易的數據完整性)
  • 重新設計架構,所以我不必排序的東西,可能爲null有一天...)

所以:可以Peewee做到這一點嗎?如果沒有,是否有比我想象的更好的解決方法?

回答

0

我認爲你說的太過複雜了,說實話。

選項:

MyModel.select().order_by(Clause(MyModel.field.desc(), SQL('NULLS LAST'))) 

MyModel.select().order_by(SQL('field DESC NULLS LAST')) 

你也可以使用一個case語句來創建一個包含1或0,表示你對排序列是否是空的別名的列。然後按順序使用該別名。

+0

謝謝,沒有意識到我可以做到這一點。爲了將來的參考:第二個選項在進行連接時非常棘手(因爲我是),因爲如果需要通過公共列名進行排序,您必須知道使用了哪個表別名。第一個選項完美工作(在我意識到我不應該在同一個子句中添加額外的列引用!)。 – ASL

相關問題