我很难获得这个SQL语句来产生我想要的结果。这是我正在使用的代码:
SELECT * FROM "Contracts" WHERE
"productType" = 'RINbuy' AND
"clearTime" IS NULL
order by
case when "holdTime" is not null then 0 else 1 end,
case when "holdTime" is not null then
"generationTime"
else "contractLimitPrice"
end;
我正在尝试获得看起来像这样的结果
+---------------+----------+--------------------+
|generationTime | holdTime | contractLimitPrice |
+---------------+----------+--------------------+
| 1 |5 | 1.282 |
| 4 |6 | 1.535 |
| 2 |NULL | 1.911 |
| 3 |NULL | 1.764 |
+---------------+----------+--------------------+
但我得到了这个:
+---------------+----------+--------------------+
|generationTime | holdTime | contractLimitPrice |
+---------------+----------+--------------------+
| 1 |5 | 1.282 |
| 4 |6 | 1.535 |
| 3 |NULL | 1.764 |
| 2 |NULL | 1.911 |
+---------------+----------+--------------------+
最后两行被切换。我尝试在每个可能的排列中添加DESC和ASC以及交换0和1.我也尝试切换case语句的顺序。
修改
我的最终目标是,如果holdTime为NOT NULL,则使用generationTime对表进行排序,如果holdTime为NULL,则按contractLimitPrice对DESC进行排序。
答案 0 :(得分:1)
问题是数据类型。一个值是日期,另一个是数字(或字符)。因此,结果被隐式转换。
你可以这样做:
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;
只有两个值,有点难以确切地说出发生了什么。但看起来它们按升序排序。
答案 1 :(得分:1)
再看看:单CASE
语句无法达到您的预期效果!您似乎希望按"holdTime" IS NULL
对"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
"holdTime" IS NULL
... FALSE
(0)在TRUE
(1)之前排序。
这也减轻了类型转换可能引起的任何问题。
第二项末尾的DESC
来自您的评论。你的问题不清楚。
原始版本:
CASE
语句仅适用于相同类型的列(或可以自动转换的类型。您没有透露实际的数据类型。无论哪种方式,如果类型不是,您将转换为更精确的类型相同。
错误消息:
> ERROR: column "generationTime DESC" does not exist LINE 6:
指向一个简单的语法错误,在您的查询中不。