我的表有三个布尔字段:f1,f2,f3。如果我做
SELECT * FROM table ORDER BY f1, f2, f3
记录将按照false,true,null的顺序按这些字段排序。我希望在true和false之间使用null来命令它们:正确的顺序应该是true,null,false。
我正在使用PostgreSQL。
答案 0 :(得分:26)
不漂亮,但应该有效:
... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc
答案 1 :(得分:22)
更好的解决方案是使用
f1 DESC NULLS LAST
如果你对订单是正确的,那么假,没有(我猜你问题的重要部分就像我现在的情况一样,将不真实的vaules放在一起)
答案 2 :(得分:3)
你也可以这样做:
order by coalesce(f1, FALSE), coalesce(f1, TRUE), ...
如果f1
为TRUE
,则会获得:TRUE, TRUE
如果f1
为NULL
,则会获得:FALSE, TRUE
如果f1
为FALSE
,则会获得:FALSE, FALSE
对应于您想要的排序顺序。
答案 3 :(得分:-1)
还可以执行以下操作:
... ORDER BY (CASE WHEN f1 IS NOT NULL THEN f1::int * 2 ELSE 1 END) DESC