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

时间:2014-03-22 12:12:17

标签: sql database postgresql

我很难获得这个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进行排序。

2 个答案:

答案 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:

指向一个简单的语法错误,在您的查询中