按列中的零值排序
Order by nil value in column
我有 table 列 position
,在某些情况下,对于某些记录集合可以是 nil
。我有默认的订单选项,比如
order('positions ASC')
id| name | position
1 5 null
2 6 null
3 7 null
如果对于我排序的某个集合(上面的示例),所有值在位置 column
中都有 null
,我将从 db 中以什么顺序获取这个集合?
我建议我将按 ID (1,2,3
) 的顺序收集。我说得对吗?
添加 #1:DB - Postgresql
你可以这样做。
猫:
id| name | position
1 5 null
2 6 null
3 7 not_null
nil = Cat.order("id ASC").where(position: nil) = [1, 2]
not_nil = Cat.order("id ASC").where("position is not null") = [3]
not_nil + nil = [3, 1, 2]
这样可以保持秩序。
根据 Postgres manual,如果没有排序子句,记录将 return 根据磁盘上的物理位置进行排序。对于排序字段上具有相同值的排序记录,它什么也没说。但是,它使用 b-tree,并且像 clasic db managers 一样,它必须 return 存储在 b-tree 中的顺序。您必须预料到每个更改都会对数据库进行重组。
最后,不保证排序字段上具有相同值的记录的顺序。
注意:使用 Postgres,您可以在第一个或最后一个设置 NULL 值(在 referrer link 中有详细说明)。
在相关问题上,我同意@macek。
我有 table 列 position
,在某些情况下,对于某些记录集合可以是 nil
。我有默认的订单选项,比如
order('positions ASC')
id| name | position
1 5 null
2 6 null
3 7 null
如果对于我排序的某个集合(上面的示例),所有值在位置 column
中都有 null
,我将从 db 中以什么顺序获取这个集合?
我建议我将按 ID (1,2,3
) 的顺序收集。我说得对吗?
添加 #1:DB - Postgresql
你可以这样做。
猫:
id| name | position
1 5 null
2 6 null
3 7 not_null
nil = Cat.order("id ASC").where(position: nil) = [1, 2]
not_nil = Cat.order("id ASC").where("position is not null") = [3]
not_nil + nil = [3, 1, 2]
这样可以保持秩序。
根据 Postgres manual,如果没有排序子句,记录将 return 根据磁盘上的物理位置进行排序。对于排序字段上具有相同值的排序记录,它什么也没说。但是,它使用 b-tree,并且像 clasic db managers 一样,它必须 return 存储在 b-tree 中的顺序。您必须预料到每个更改都会对数据库进行重组。
最后,不保证排序字段上具有相同值的记录的顺序。
注意:使用 Postgres,您可以在第一个或最后一个设置 NULL 值(在 referrer link 中有详细说明)。
在