Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于将布尔列排序为true、null、false的SQL_Sql_Postgresql_Sorting_Boolean - Fatal编程技术网

用于将布尔列排序为true、null、false的SQL

用于将布尔列排序为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

我的表格有三个布尔字段: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

更好的解决办法是使用

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
,我肯定会使用它。