sql - 在 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
当有多个标准时我可以使用吗?
解决方案
一种方法是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)
这似乎符合您问题中的逻辑。但是,也可能存在其他情况。
推荐阅读
- c++ - SIZE_T 和 unsigned long 有什么区别?
- angular - 哪些角度版本与 AspNetCore SpaServices 兼容?
- php - 有什么方法可以“挂钩”PHP 的“回声”机制吗?
- c# - c# - 用括号中的嵌套子项拆分逗号分隔的字符串
- ruby - 无法在 CentOS 8 上安装 gem
- python - 在python中更新json对象中的值
- java - HashMap#replace 的复杂度是多少?
- javascript - 无法在 AthenaRequest.getResultsStream 的 Request.createReadStream 中读取未定义的属性“流”
- r - 如何将 igraph 格式的图形转换为 R 中的 qgraph 格式?
- json - PostgreSQL:使用 '' 解析 JSON 时出错