首页 > 解决方案 > 在 BigQuery 中格式化电话号码

问题描述

我想根据他们的电话号码计算每个客户分组的总订单,但问题是电话号码的格式很乱。(我选择按他们的电话号码分组,因为有时名字不同,可能是他们的全名或只是昵称)

这是一个例子

+-------+--------------+----------+------------+
| Name  | phone_number | Order Id | Order Type |
+-------+--------------+----------+------------+
| Andy F| 08212345     |        1 | A          |
| Andy  | 821345       |        2 | A          |
| Andi F| 08212345     |        3 | B          |
| Chris | +7712345     |        4 | A          |
| Cris  | 7712345      |        5 | B          |
+-------+--------------+----------+------------+

问题是,本地号码以0但有时电话号码不包含该号码0,如您所见,如Andy电话号码。它有相同的电话号码,但不是以 开头0

另一个问题是,当它是外国人号码时,有时它已经包含+代码,有时它没有。就像Chris,一个是+77另一个是77

我想要的输出是这样的,所以我可以按他们的电话号码分组

+-------+--------------+----------+------------+
| Name  | phone_number | Order Id | Order Type |
+-------+--------------+----------+------------+
| Andy F| +628212345   |        1 | A          |
| Andy  | +62821345    |        2 | A          |
| Andi F| +628212345   |        3 | B          |
| Chris | +7712345     |        4 | A          |
| Cris  | +7712345     |        5 | B          |
+-------+--------------+----------+------------+

无论如何要格式化所有这些数字吗?

我通常使用REGEXP_REPLACE(TRIM(phone_number),r'^8','+62') AS phone_number,但它仅适用于 1 个标准。

regexp_replace当有多个标准时我可以使用吗?

标签: sqlpostgresqlgoogle-bigquery

解决方案


一种方法是case表达式:

(case when phone_number like '082%'
      then concat('+6282', substr(phone_number, 4))
      when phone_number like '82%'
      then concat('+6282', substr(phone_number, 3))
      when phone_number like '+%'
      then phone_number
      else concat('+', phone_number)
 end)

这似乎符合您问题中的逻辑。但是,也可能存在其他情况。


推荐阅读