即使“日期”是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布尔列正确排序日期?
由于
答案 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 ALL
或UNION
是否是更好的选择。
(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,从旧到新。