Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
案例中的SQL顺序、DESC和ASC奇数行为_Sql_Database_Postgresql - Fatal编程技术网

案例中的SQL顺序、DESC和ASC奇数行为

案例中的SQL顺序、DESC和ASC奇数行为,sql,database,postgresql,Sql,Database,Postgresql,我很难让这个SQL语句产生我想要的结果。这是我正在使用的代码: 从“合同”中选择*,其中 “productType”=“RINbuy”和 “clearTime”为空 订购人 如果“holdTime”不为空,则0或1结束, 如果“保持时间”不为空,则为 “生成时间” 否则“合同价格” 结束 我想得到这样的结果 +---------------+----------+--------------------+ |发电时间|保持时间|合同限价| +---------------+----------+

我很难让这个SQL语句产生我想要的结果。这是我正在使用的代码:

从“合同”中选择*,其中
“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进行排序。