用于将布尔列排序为true、null、false的SQL
我的表格有三个布尔字段:f1、f2、f3。如果我这样做用于将布尔列排序为true、null、false的SQL,sql,postgresql,sorting,boolean,Sql,Postgresql,Sorting,Boolean,我的表格有三个布尔字段:f1、f2、f3。如果我这样做 SELECT * FROM table ORDER BY f1, f2, f3 记录将按这些字段按false、true、null的顺序排序。我希望在true和false之间用null来排序:正确的顺序应该是true,null,false 我正在使用PostgreSQL。不漂亮,但应该可以: ... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc
SELECT * FROM table ORDER BY f1, f2, f3
记录将按这些字段按false、true、null的顺序排序。我希望在true和false之间用null来排序:正确的顺序应该是true,null,false
我正在使用PostgreSQL。不漂亮,但应该可以:
... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc
更好的解决办法是使用
f1 DESC最后为空
如果你同意真、假、零的顺序(我想你问题的重要部分是,就像我现在的情况一样,把不真实的vaules放在一起)
您还可以执行以下操作:
order by coalesce(f1, FALSE), coalesce(f1, TRUE), ...
... ORDER BY (CASE WHEN f1 IS NOT NULL THEN f1::int * 2 ELSE 1 END) DESC
如果f1
为TRUE
,则得到:TRUE,TRUE
如果
f1
为NULL
,则得到:FALSE,TRUE
如果
f1
为FALSE
,则会得到:FALSE,FALSE
它对应于您想要的排序顺序。也可以执行以下操作:
order by coalesce(f1, FALSE), coalesce(f1, TRUE), ...
... ORDER BY (CASE WHEN f1 IS NOT NULL THEN f1::int * 2 ELSE 1 END) DESC
显然,对于其他每个变量,您都必须执行相同的操作。+1。让我们把它弄得更难看:
按合并顺序((不是bool_字段)::INTEGER*2,1)
:)错误:函数isnull(布尔值)不存在exist@pilcrow谢谢)确实需要强制转换为int,因为COALESCE(bool\u字段,true)
顺序不正确虽然这很有用,但不能回答问题,由于在某些情况下,您确实希望null
介于true
和false
之间。如果null
在开始或结束时都不正常,则可能需要考虑使用枚举。一般来说,一个可为空的布尔值应该成为一个枚举。我喜欢这个。无法投票,因为它不符合问题,但我不知道上次的NULLS
,我肯定会使用它。