Peewee:怎么办ORDER BY ... NULLS(第一|最后)?

时间:2016-08-23 17:17:32

标签: postgresql peewee

标题几乎总结了一下:我想指定空值在我的结果中是第一个还是最后一个。在我的特定情况下,我希望以降序排序顺序获取空值,对应于SQL,如下所示:

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

这是PostgreSQL语法(我正在使用这个项目)。同样的问题可能适用于其他数据库(虽然我不认为MySQL支持该语法,不确定它是否支持该功能)。当然,首先有空值是升序(see PostgreSQL docs)的默认值,所以只有DESC NULLS FIRST和ASC NULLS LAST的组合才有用......除了方便的话,MySQL默认为precisely the opposite. < / p>

似乎我应该能够做到以下其中一项:

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

我不是Python大师,但我在Peewee文档或源代码中找不到任何看起来像我想要的东西。

当然可能有很多变通方法。以下是我发现或想到的,按实际性递减顺序(对我而言):

  • 使用原始SQL(实际上可以在我的情况下工作,但如果我以后需要这些对象,那就太好了)
  • 通过其他东西(例如函数,我不确定如何处理Peewee,或者在this的行中添加派生列)伪造它。
  • 也许使用UNION来组合一个有WHERE的查询?一个有WHERE的IS NOT NULL? IS NULL ......但这在几个方面似乎有问题,例如我不知道Peewee是否也能做到这一点,而且无论如何最好还是做整个ORDER BY
  • 运行两个单独的查询并将他们的结果集放在Python中...再次,听起来像我认为的麻烦(额外开销,需要1个事务来保证数据完整性)
  • 重新设计架构,所以我不必订购可能为空的东西(可能有一天......)

所以:Peewee可以这样做吗?如果没有,是否有比我想到的更好的解决方法?

1 个答案:

答案 0 :(得分:1)

说实话,我认为你的问题太复杂了。

从Peewee 3.x开始,您可以指定空值的处理:

  for (var k = 0; k < coordinateLength - 1; k++) {
                var coordinateInfoTemp = coordinates[k].split("~");
                for (var j = 0; j < markerList.length; j++) {
                    var markerTmp = markerList[j];
                    if (markerTmp.store_id === coordinateInfoTemp[3]) {
                        var latlngNew = new google.maps.LatLng(coordinateInfoTemp[1].replace(',', '.'), coordinateInfoTemp[0].replace(',', '.'));
                        markerTmp.setPosition(latlngNew);
                        infowindow.setContent(yourcontent);//update here
                        break;
                    }
                }
            }

您还可以使用case语句创建包含1或0的别名列,以指示要排序的列是否为null。然后按顺序使用该别名。