【问题标题】:Multiple order by and null values to be ordered using next fields not to be first or last使用下一个字段排序的多个 order by 和 null 值不是第一个或最后一个
【发布时间】:2016-08-01 02:13:23
【问题描述】:

我有一张如下表,

|产品 |品牌 |订购 |描述 | -------------------------------------------------- -------- |TTT | CCC | 1 | FFF | |电子电气设备 | DDD | 2 | DDD | |ZZZ |血脑屏障 | 99 |空 | |神经网络 | FFF | 99 |空 | |QQ |电子电气设备 |空 |空 | |BBB | FFF | 1 | FFF | |BBB | GGG | 1 | CCC | |GGG |空 |空 |空 | |嗯|血脑屏障 | 99 |空 |

我想按 Order asc、Description asc、Brand asc、Product asc 订购, 但是 Order null 和 99 应该被视为一组,然后按 Brand 和 Product 排序。

预期结果应如下所示,

|产品 |品牌 |订购 |描述 | -------------------------------------------------- -------- |BBB | GGG | 1 | CCC | |TTT | CCC | 1 | FFF | |BBB | FFF | 1 | FFF | |电子电气设备 | DDD | 2 | DDD | |嗯|血脑屏障 | 99 |空 | |ZZZ |血脑屏障 | 99 |空 | |QQ |电子电气设备 |空 |空 | |神经网络 | FFF | 99 |空 | |GGG |空 |空 |空 |

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

【问题讨论】:

  • “订单空和99应该被视为一组”是什么意思?
  • 当 order 为 99 或 NULL 时,它应该只根据 Brand 和 Product 进行排序。谢谢
  • 那么就是说如果是99或者NULL,应该在结果列表的末尾吧?
  • description 不为null 时,按Order、Description、Brand、Product 排序(可视为排名0)。当 Order 为 null 或 99(可以认为是排名 1)时,应按 Brand 和 Product 排序。当除产品(排名 2)之外的所有内容都为空时,应按产品订购。以另一种方式,每个排名应该有不同的列用于排序。谢谢
  • 您可以使用COALESCENULL 值替换为您想要的任何值,例如,如果您认为NULL99 相同,请在@ 中使用COALESCE(Order, 99) 987654326@ 子句。

标签: android sqlite


【解决方案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;

【讨论】:

  • SELECT ... ORDER BY CASE WHEN "Order" 不为 NULL 并且 "Description" 不为 NULL THEN "Order" ELSE CASE WHEN "Brand" IS NOT NULL THEN "Brand" ELSE 'ZZZZZZ' END END,订单,描述,品牌,产品。品牌、产品;
  • 实际上 //'ZZZZZZ' 将在内部分配给 null 的品牌,因此项目将在列表中的最后一个。谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 2011-09-25
  • 2022-01-05
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多