用于将boolean列排序为true,null,false的SQL

pet*_*ern 20 sql sorting postgresql boolean

我的表有三个布尔字段:f1,f2,f3.如果我做

SELECT * FROM table ORDER BY f1, f2, f3
Run Code Online (Sandbox Code Playgroud)

记录将按照false,true,null的顺序按这些字段排序.我希望在true和false之间使用null来命令它们:正确的顺序应该是true,null,false.

我正在使用PostgreSQL.

mer*_*ike 27

不漂亮,但应该工作:

   ... order by (case when f1 then 1 when f1 is null then 2 else 3 end) asc
Run Code Online (Sandbox Code Playgroud)

  • +1.让它变得更加丑陋:`命令COALESCE((不是bool_field):: INTEGER*2,1)`.:) (12认同)
  • 显然你必须为每个其他变量做同样的事情. (2认同)

Yo *_*dke 26

更好的解决方案是使用

f1 DESC NULLS LAST

如果你对订单是正确的,那么假,没有(我想你的问题的重要部分就像我现在的情况一样,将不真实的vaules放在一起)

/sf/answers/533486271/

  • 尽管这很有用,但是它不能回答问题,因为在某些情况下,您确实希望在true和false之间使用null。 (2认同)

小智 10

这应该效果更好

order by (f1 is true) desc
Run Code Online (Sandbox Code Playgroud)

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)

小智 5

您还可以执行以下操作:

order by coalesce(f1, FALSE), coalesce(f1, TRUE), ...
Run Code Online (Sandbox Code Playgroud)

如果f1TRUE,则得到:TRUE, TRUE
如果f1NULL,则得到:FALSE, TRUE
如果f1FALSE,则得到:FALSE, FALSE

对应于您想要的排序顺序。