根据布尔列升序或降序

ascending or descending order according to boolean column

这是 PostgreSQL 10 中的 table 结构。

尽管 "date" 是 int,但它表示 yyyy mm dd 日期。我正在尝试编写一个按日期排序的 SELECT,当它为 BC=true 时为 desc,因此日期将按正确的顺序排列 -500 01 02 然后 -500 01 03 (yyyy mm dd)
当 BC=false 时,它​​是 asc,因此日期将再次按正确顺序排列 1500 01 02,然后是 150 01 03 (yyyy mm dd)

我想出了这个 SELECT * FROM test ORDER BY bc=true desc, bc=false asc; 在 BC 日期上效果很好,但它翻转了 AD 日期(15000103 然后 15000102,这是错误的)。

我知道有可用的 date 类型,但我希望它能作为精确 BC 日期的 hack。

如何更改 SELECT 以根据 BC 布尔列正确排序日期?

谢谢

我认为 bc=true desc, bc=false asc 效果不佳。等我有电脑再看看,稍后更新我的答案。

也许我的解决方案只是一个把戏或作弊。这不是合法的方式。你可以试试这个。

SELECT * FROM test 
ORDER BY bc DESC, CASE WHEN bc THEN date*(-1) ELSE date END ASC;

SELECT * FROM test 
ORDER BY bc DESC, CASE WHEN bc THEN abs(date) ELSE date END ASC;

希望我的回答能让您满意

我会选择 absolute value:

t=# with c(d) as (values(-51),(50))
select * from c order by abs(d);
  d
-----
  50
 -51
(2 rows)

我相信一个简单的联合也可以解决它。

我在 Fiddle 上测试过它: http://sqlfiddle.com/#!9/96ed2/1/0

似乎有效:

( SELECT * FROM mytable 
WHERE bc=true 
ORDER BY date DESC) 

UNION ALL 
( SELECT * FROM mytable WHERE bc=false ORDER BY date)
ORDER BY bc DESC, date

我使用的数据集:

CREATE TABLE mytable (
  id serial PRIMARY KEY,  
  name VARCHAR (50),
  date INTEGER,
  bc BOOLEAN
);

INSERT INTO mytable (id, name, date, bc) VALUES (1,'one',-6000102, true);
INSERT INTO mytable (id, name, date, bc) VALUES (2,'two',-3000202, true);
INSERT INTO mytable (id, name, date, bc) VALUES (3,'three',-5000103, true);
INSERT INTO mytable (id, name, date, bc) VALUES (4,'four',19000109, false);
INSERT INTO mytable (id, name, date, bc) VALUES (5,'five',15000105, false);

您应该知道 UNION ALLUNION 是更好的选择。 ( https://www.postgresql.org/docs/8.3/static/queries-union.html )

在测试并尝试不同的语法组合之后,我想出了这个,基于 this

select * from test
 order by
 case when bc = true then bc end asc ,
 case when bc = true then date end desc,
 case when bc = false then date end asc,
 case when bc = false then bc end desc;

成功输出

-5000102
-5000103
-5000103
5000102
5000103
5000301
5000302
15000102
15000103

因此,日期格式为 yyyy-mm-dd,从公元前到公元,从旧到新。