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

标签 sql database postgresql

我很难让这个 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/

相关文章:

sql - 如何在一列中返回多个值(T-SQL)?

mysql - SQL通过许多相关的外键进行选择

string - 我如何从 PostgreSQL 中的十六进制中获取字符串值?

sql - 基于另一列的 PostgreSQL 序列

mysql - Prestashop 1.6 获取特定类别产品的特征值

java - 获取 Java.sql.SQLException : ORA-01461: can bind a LONG value only for insert into a LONG column. 。插入数据时

数据库未打开: queries allowed on fixed tables/views only Error

mysql - 可包含可定制产品 (RDMS) 的订单的数据库架构

java - 为什么刷新实体管理器时数据库没有更新?

java - 如何使用 Postgres 的 $index 参数格式化 JDBCPreparedStatment