根据布尔列升序或降序
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 ALL
或 UNION
是更好的选择。
( 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,从公元前到公元,从旧到新。
这是 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 ALL
或 UNION
是更好的选择。
( 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,从公元前到公元,从旧到新。