使用下一个字段排序的多个order by和null值不是第一个或最后一个

时间:2016-08-01 02:13:23

标签: android sqlite

我有一张如下表格,

|Product |Brand  |Order           |Description          |
---------------------------------------------------------
|TTT     | CCC   | 1              | FFF                 |
|EEE     | DDD   | 2              | DDD                 |
|ZZZ     | BBB   | 99             | NULL                |
|NNN     | FFF   | 99             | NULL                |
|QQQ     | EEE   | NULL           | NULL                |
|BBB     | FFF   | 1              | FFF                 |
|BBB     | GGG   | 1              | CCC                 |
|GGG     | NULL  | NULL           | NULL                |
|MMM     | BBB   | 99             | NULL                |

我想通过订单asc,描述asc,品牌asc,产品asc订购, 但订单null和99应被视为一个组,然后按品牌和产品排序。

预期结果应如下所示,

|Product | Brand |Order           |Description          |
---------------------------------------------------------
|BBB     | GGG   | 1              | CCC                 |
|TTT     | CCC   | 1              | FFF                 |
|BBB     | FFF   | 1              | FFF                 |
|EEE     | DDD   | 2              | DDD                 |
|MMM     | BBB   | 99             | NULL                |
|ZZZ     | BBB   | 99             | NULL                |
|QQQ     | EEE   | NULL           | NULL                |
|NNN     | FFF   | 99             | NULL                |
|GGG     | NULL  | NULL           | NULL                |

null始终是第一个或最后一个,但是我需要一个查询来根据每个条件使用不同的字段排序。

1 个答案:

答案 0 :(得分:1)

可以使用CASE expressions来处理此类异常。

Order为NULL时,应将其处理为99,因此将NULL替换为99。 当Order为NULL或99时,应忽略描述,因此在这种情况下,将Description替换为固定值:

SELECT ...
ORDER BY CASE WHEN "Order" IS NULL THEN 99 ELSE "Order" END,
         CASE WHEN "Order" IS NULL OR "Order" = 99 THEN 0 ELSE Description END,
         Brand,
         Product;