在 BigQuery 中按 LOWER 高效排序

Posted

技术标签:

【中文标题】在 BigQuery 中按 LOWER 高效排序【英文标题】:Efficiently sorting by LOWER in BigQuery 【发布时间】:2018-03-08 00:48:55 【问题描述】:

这篇精彩的 blog posts 谈到了在 where 子句中使用 LOWER() 的低效率以及更有效的文本搜索方式。在ORDER BY 子句中有类似的方法吗?例如:

SELECT * FROM mytable
ORDER BY LOWER(first_name)

按字段名称的小写文本进行排序的最有效方法是什么,例如在按列排序时在 Google 表格或 Excel 中进行排序?

【问题讨论】:

来自相应 SO 帖子的重要说明 - Note from the team: Stay tuned! Very soon BigQuery will turn this advice irrelevant. 你看到了吗? :o) @MikhailBerlyant 是的,我也注意到了这一点。不知道什么时候会实施。我每天都会查看他们的发布文档。 有些事情已经更快了——您尝试过博客文章中的查询吗?我认为在解决所有已知问题之前我们不会更新发行说明,但前几个查询只需要大约 4 或 5 秒而不是 10 秒。我不认为 ORDER BY LOWER(...) 在任何情况下都应该很慢。 很棒的博客/帖子;很棒的团队!!! :o) 完全正确 - 我现在必须在博客上写一篇文章 :) 【参考方案1】:

引用博客中的 RegExp 方法将不起作用/适用于此处(对于 ORDER BY ),因为用于 BigQuery 正则表达式支持的 re2 库不支持相应的所需功能

特别是 - re2 不支持在正则表达式替换中更改大小写

如果它会被支持 - 你可以使用类似的东西

REGEXP_REPLACE(first_name, r'.*', r'\L\0') <-- just mockup - does not work with BigQuery

这里\L - 将所有后续标记转换为它们各自的小写等效项 和\0(BQ 支持)匹配整个模式,因此整个first_name 列将替换为相应的小写版本

见例子here

但是 - 再次 - BigQuery / re2 不支持 \L

【讨论】:

以上是关于在 BigQuery 中按 LOWER 高效排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 中按外键分组?

在 Bootstrap-Vue 中按列对 <b-table> 进行排序并禁止用户排序

如何在bigquery中按月创建分区

在 bigquery 中按月显示数据

如何在bigquery中按月/年汇总

在 Bigquery 中按用户计算登录之间的时间