我很难让这个 SQL 语句产生我想要的结果。这是我正在使用的代码:
从“契约(Contract)”中选择*,其中
“产品类型”=“RINbuy”并且
“清除时间”为空
订购依据
当“holdTime”不为空时则为 0,否则为 1 结束,
当“holdTime”不为空时的情况
《世代时间》
否则“契约(Contract)限制价格”
结束;
我正在尝试获得如下所示的结果
+----------------+--------------------+---------------- ----+
|一代时间|保持时间 |合约限价|
+----------------+----------+--------------------+
| 1 |5 | 1.282 | 1.282
| 4 |6 | 1.535 | 1.535
| 2 |空| 1.911 | 1.911
| 3 |空| 1.764 | 1.764
+----------------+----------+--------------------+
但是我得到了这个:
+----------------+--------------------+---------------- ----+
|一代时间|保持时间 |合约限价|
+----------------+----------+--------------------+
| 1 |5 | 1.282 | 1.282
| 4 |6 | 1.535 | 1.535
| 3 |空| 1.764 | 1.764
| 2 |空| 1.911 | 1.911
+----------------+----------+--------------------+
最后两行交换位置。我尝试过在每种可能的排列中添加 DESC 和 ASC 以及交换 0 和 1。我还尝试过切换 case 语句的顺序。
编辑:
我的最终目标是,如果holdTime不为空,则按生成时间对表进行排序,如果holdTime为空,则按contractLimitPrice对表进行DESC排序。
最佳答案
再看一下:单个 CASE
语句无法达到您预期的效果!似乎您想按 "contractLimitPrice"
对 "holdTime"IS NULL
的行进行排序,其余按 "GenerationTime"
排序。
如果是这样,请改用它:
ORDER BY "holdTime" IS NULL
, CASE WHEN "holdTime" IS NULL THEN "contractLimitPrice" END DESC
, CASE WHEN "holdTime" IS NULL THEN NULL ELSE "generationTime" END
"holdTime"IS NULL
... FALSE
(0) 排序在 TRUE
(1) 之前。
这也缓解了类型转换可能出现的任何问题。
第二项末尾的 DESC
来自您的评论。你的问题没有明确说明。
对于您的原始版本:
CASE
语句仅适用于相同类型(或可以自动转换的类型)的列。您没有透露您的实际数据类型。无论哪种方式,如果类型不相同。
错误信息:
> ERROR: column "generationTime DESC" does not exist LINE 6:
指向一个简单的语法错误,该错误不出现在您的查询中。
关于案例中的 SQL 顺序、DESC 和 ASC 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22577425/