根据布尔列的升序或降序

时间:2018-01-27 17:03:10

标签: sql postgresql sql-order-by

这是PostgreSQL 10中的表结构 enter image description here

即使“日期”是int,它也代表了一个yyyy mm dd日期。我想写一个按日期排序的SELECT,当它是BC = true时它是desc,所以日期将是正确的顺序-500 01 02然后-500 01 03(yyyy mm dd)
当is = BC = false时它是asc,所以日期将是正确的顺序1500 01 02,然后150 01 03(yyyy mm dd)

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

我知道有SELECT类型可用,但我希望这可以作为确切BC日期的黑客。

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

由于

4 个答案:

答案 0 :(得分:3)

我认为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;

希望我的回答能满足你。

答案 1 :(得分:0)

我会选择absolute value

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

答案 2 :(得分:0)

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

我在小提琴上测试过: 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

答案 3 :(得分:0)

经过测试并尝试不同的语法组合后,我根据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格式,从BC到AD,从旧到新。