作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从数字列表中提取国家/地区代码前缀,并将它们与它们所属的区域进行匹配。数据可能如下所示:
| id | phone_number |
|----|----------------|
| 1 | +27000000000 |
| 2 | +16840000000 |
| 3 | +10000000000 |
| 4 | +27000000000 |
| country | count |
|-----------------------------|-------|
| South Africa | 2 |
| American Samoa | 1 |
| United States and Caribbean | 1 |
SELECT
CASE
WHEN SUBSTRING(phone_number,1,5) = '+1684' THEN 'American Samoa'
WHEN SUBSTRING(phone_number,1,5) = '+1264' THEN 'Anguilla'
...
WHEN SUBSTRING(phone_number,1,5) = '+1599' THEN 'Saint Martin'
WHEN SUBSTRING(phone_number,1,4) = '+355' THEN 'Albania'
WHEN SUBSTRING(phone_number,1,4) = '+213' THEN 'Algeria'
...
WHEN SUBSTRING(phone_number,1,4) = '+263' THEN 'Zimbabwe'
WHEN SUBSTRING(phone_number,1,3) = '+93' THEN 'Afghanistan'
WHEN SUBSTRING(phone_number,1,3) = '+54' THEN 'Argentina'
...
WHEN SUBSTRING(phone_number,1,3) = '+58' THEN 'Venezuela'
WHEN SUBSTRING(phone_number,1,3) = '+84' THEN 'Vietnam'
WHEN SUBSTRING(phone_number,1,2) = '+1' THEN 'United States and Caribbean'
WHEN SUBSTRING(phone_number,1,2) = '+7' THEN 'Kazakhstan, Russia'
ELSE 'unknown'
END as country_name,
count(*)
FROM users
GROUP BY country_name
order by count desc
WHEN ... THEN
案件。它似乎非常低效并且超时。我认为这是因为它在每一行上运行模式匹配。这将需要扩展到大约 10 百万行
最佳答案
尽管阅读了整个表格,但索引可以在这里提供帮助。为了按国家/地区代码聚合数据,DBMS 必须按国家/地区代码对所有行进行排序。排序是一项昂贵的操作,尤其是在大型数据集上。如果您有国家/地区代码的索引,DBMS 会在索引中找到已经预先排序的代码,并且可以避免对数据进行排序的工作。
列中没有单独的国家/地区代码,但每个电话号码都以代码开头,因此您可以索引完整的电话号码:
create index idx on users (phone_number);
SUBSTRING
的函数在电话号码上很可能使 DBMS 对此视而不见。使用
LIKE
反而。根据文档(
https://www.postgresql.org/docs/9.3/indexes-types.html ),字符串索引可以与
LIKE 'something%'
一起使用:
WHEN phone_number LIKE '+1684%' THEN 'American Samoa'
关于sql - 如何从SQL中的电话号码将电话号码前缀与国家/地区匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60786098/
我是一名优秀的程序员,十分优秀!