繁体   English   中英

按名称子句订购Postgres结果

[英]Ordering Postgres Results by name clause

所以我有一个查询,看起来像这样:

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

是否可以构造一个查询来执行此操作,或者我是否需要在控制器中处理此顺序?

谢谢你们的帮助。

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;

在SQL中可以通过建立一个case语句来做到这一点。 根据您的where子句,可以将其简化为:

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

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


这将在具有100万个以上帐户的数据库上进行搜索,因此,我认为在查询中这样做是最好的。 如果您不同意,请告诉我

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

根据我的示例数据,如果我怀疑正在扫描重复数据,那么每次将处理少量的行。 在这种情况下,对应用程序进行排序就算不是更好,也是如此:它可以释放数据库服务器上的CPU周期,并且如果您的最终意图是自动合并行,则可以使用任何数量的复杂排序条件。

另一方面,如果您的查询返回的是数以万计的行,那么您可能不应该先通过case语句进行排序:这样做会阻止您使用适当的索引,因此这些查询将迅速潜入慢速查询中日志。 创建一个附加字段( sort_namedisplay_name怎么样),对其进行索引,相应地修改您的数据库和应用程序逻辑,并使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM