这是PostgreSQL 10中的表结构。
虽然“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布尔列正确排序日期?
谢谢
![enter image description here](https://istack.dev59.com/87PAL.webp)
当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布尔列正确排序日期?
谢谢
SELECT * FROM test ORDER BY date IF bc=true THEN desc ELSE asc;
但无论我尝试什么,都会出现语法错误。 - codebot*(-1)
。我不是专家,无法判断任何解决方案是更好还是更差,但我建议另一种解决方案。谢谢。 - codebotCASE WHEN
阶段中。或者你可以像@VaoTsun在下面的回答中建议的那样,用abs(date)
替换date*(-1)
。根据我的经验,PostgreSQL没有在“排序”中使用条件,你必须先预处理数据,然后按照你想要的ASC或DESC进行排序。 - Mabu Kloesen