按名称子句订购Postgres结果

时间:2013-11-11 19:47:41

标签: sql postgresql sql-order-by

所以我的查询看起来像这样:

SELECT *
  FROM accounts
WHERE firstname = "Tom Bill"
  OR (firstname = "Tom" AND middlename = "Bill")
  OR (firstname = "Bill" AND middlename = "Tom"); 

我的目标是让查询以这种方式自我排序:

All Tom Bill first
All Tom + Bill second 
All Bill + Tom third

是否可以构建一个执行此操作的查询,还是需要在控制器中处理此顺序?

谢谢你们的帮助。

2 个答案:

答案 0 :(得分:1)

SELECT ...
WHERE ...
ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0 ELSE 1 END,
         CASE WHEN firstname = "Tom" AND middlename = "Bill" THEN 0 ELSE 1 END,
         CASE WHEN firstname = "Bill" AND middlename = "Tom" THEN 0 ELSE 1 END;

您也可以将其写为:

SELECT ...
WHERE ...
ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0
              WHEN firstname = "Tom" AND middlename = "Bill" THEN 1
              WHEN firstname = "Bill" AND middlename = "Tom" THEN 2
              ELSE 3 END;

答案 1 :(得分:0)

可以通过构建case语句在SQL中执行此操作。根据您的where子句,它可以简化为:

ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0
              WHEN firstname = "Tom" THEN 1
              ELSE 2 END

通过在控制器中订购这种东西,你通常会更好,但是,因为生成所需的case语句(无论是否在ORM中),虽然简单,但往往有点混乱。< / p>


  

这将在具有100万个帐户的数据库上运行搜索,所以我相信在查询中执行此操作是最好的。如果您不同意,请告诉我

这取决于您要返回的行数。

如果我怀疑基于您的示例数据,您正在扫描重复数据,那么每次都会处理少量行。在这种情况下,在您的应用程序中进行排序即使不是更好也是好的:它可以释放数据库服务器上的CPU周期,并且如果您的最终目的是自动合并行,它允许您使用任意数量的复杂排序条件。

另一方面,如果您的查询返回了大量的行,您可能不应该通过case语句开始排序:这样做会阻止您使用正确的索引,因此这些查询会立即进入你的慢查询日志。创建一个附加字段(sort_namedisplay_name怎么样?),对其编制索引,相应地修改数据库和应用程序逻辑,然后使用它。