在sqlalchemy中,是否有一种排序方法,以使空单元格无论最后还是排序顺序都在末尾?

roh*_*hpr 6 python sqlalchemy

我有一个非常标准的设置,想按一列排序:

someselect.order_by(asc(table1.mycol))

不过,我想用行''NULLmycol出现在结果的末尾。有没有办法做到这一点?

uni*_*rio 6

在支持的数据库上NULLS LAST,您可以NULL通过执行以下操作在末尾对 s进行排序

SELECT * FROM table1 ORDER BY mycol ASC NULLS LAST;
Run Code Online (Sandbox Code Playgroud)

您需要转换''NULLs,以便可以在数据中或作为查询的一部分执行此操作(无论如何我建议这样做):

SELECT * FROM table1 ORDER BY (CASE mycol WHEN '' THEN NULL ELSE mycol END) ASC NULLS LAST;
Run Code Online (Sandbox Code Playgroud)

或者,一种更便携的方法是

SELECT * FROM table1 ORDER BY (CASE WHEN mycol IS NULL OR mycol = '' THEN 1 ELSE 0 END) ASC, mycol;
Run Code Online (Sandbox Code Playgroud)

要在 SQLAlchemy 中编写此内容:

.order_by(case([(or_(tabel1.mycol.is_(None), table1.mycol == ""), 1)],
               else_=0), table1.mycol)
Run Code Online (Sandbox Code Playgroud)


wod*_*dow 6

SQLAlchemy具有表达式的NULLS LAST修饰符ORDER BY

sqlalchemy.sql.expression.nullslast(column)
Run Code Online (Sandbox Code Playgroud)

参见http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.nullslast

  • 请注意,这似乎不适用于较旧的 MySQL 版本。对于 5.7 上的我来说,它会生成语法错误 (2认同)
  • 在 1.4+ 中,“nullsfirst”和“nullslast”已重命名为“nulls_first”和“nulls_last”,但从 2.0 开始,旧名称仍然有效。 (2认同)