案例中的SQL顺序、DESC和ASC奇数行为
我很难让这个SQL语句产生我想要的结果。这是我正在使用的代码:案例中的SQL顺序、DESC和ASC奇数行为,sql,database,postgresql,Sql,Database,Postgresql,我很难让这个SQL语句产生我想要的结果。这是我正在使用的代码: 从“合同”中选择*,其中 “productType”=“RINbuy”和 “clearTime”为空 订购人 如果“holdTime”不为空,则0或1结束, 如果“保持时间”不为空,则为 “生成时间” 否则“合同价格” 结束 我想得到这样的结果 +---------------+----------+--------------------+ |发电时间|保持时间|合同限价| +---------------+----------+
从“合同”中选择*,其中
“productType”=“RINbuy”和
“clearTime”为空
订购人
如果“holdTime”不为空,则0或1结束,
如果“保持时间”不为空,则为
“生成时间”
否则“合同价格”
结束代码>
我想得到这样的结果
+---------------+----------+--------------------+
|发电时间|保持时间|合同限价|
+---------------+----------+--------------------+
| 1 |5 | 1.282 |
| 4 |6 | 1.535 |
|2 |空| 1.911|
|3 |空| 1.764|
+---------------+----------+--------------------+
但我明白了:
+---------------+----------+--------------------+
|发电时间|保持时间|合同限价|
+---------------+----------+--------------------+
| 1 |5 | 1.282 |
| 4 |6 | 1.535 |
|3 |空| 1.764|
|2 |空| 1.911|
+---------------+----------+--------------------+
最后两行被切换。我尝试在每种可能的排列中添加DESC和ASC,以及交换0和1。我还尝试了转换案例陈述的顺序。
编辑:
我的最终目标是,如果holdTime不为NULL,则按generationTime对表进行排序;如果holdTime为NULL,则按contractLimitPrice对表进行排序。问题在于数据类型。一个值是日期,另一个值是数字(或字符)。因此,结果被隐式转换
您只需执行以下操作:
order by (case when "holdTime" is not null then 0 else 1 end),
(case when "holdTime" is not null then "generationTime" end),
(case when "holdtime" is null then "contractLimitPrice" end)
当第二个和第三个条件不成立时,您不必担心会产生额外的NULL
值。第一个条件确保基于有效的holdtime
的组一起出现
编辑:
你试过这个吗
order by (case when "holdTime" is not null then 0 else 1 end),
(case when "holdTime" is not null then "generationTime"
else "contractLimitPrice"
end) desc;
因为只有两个值,所以很难准确地说出发生了什么。但是看起来它们是按升序排序的。再看一眼:单个的CASE
语句无法完成您似乎期望的任务!似乎您希望按“holdTime”为空的行排序,按“contractLimitPrice”
排序,其余的按“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
“保持时间”为空
FALSE
(0)在TRUE
(1)之前排序
这也减轻了类型转换可能产生的任何问题
第二项末尾的DESC
来自您的注释。从你的问题看不清楚
对于原始版本:
CASE
语句仅适用于相同类型(或可以自动转换的类型)的列。您没有透露实际的数据类型。无论哪种方式,如果类型不相同,您都可以更精确地转换为该类型
错误消息:
> ERROR: column "generationTime DESC" does not exist LINE 6:
指向一个简单的语法错误,该错误不在您的查询中。为了回答这个问题,我将日期更改为人类可读的日期。时间存储为unix时间,存储为双精度,contractLimitPrice也存储为双精度。我尝试了您的建议,得到了相同的输出。很抱歉没有输入“real”值,我将编辑我的OP。您能否发布两种情况的输出:(1)在最后分号之前添加DESC;(2)在第二个case语句的字段名引号内添加DESC,如generationTime DESC
@ChrisJohnson case(1):底部的两行是正确的行,但顶部的两行是翻转的。case(2):我在引号中输入DESC时出错error:列“generationTime DESC”不存在第6行:“holdTime”不为空时的情况“generationTime DESC.
该示例没有阐明所有可能的情况。每列的数据类型都是双精度的。我尝试了您建议的两段代码。这两段代码的结果与我使用代码得到的结果相同。我需要弄清楚当保持时间为空时,如何获得合同限价以对DESC进行排序。