我想创建一个列表来计算电子邮件提供商的数量,无论指定的是哪个国家/地区代码。即,ex@gmail.com和ex@gmail.uk都将归入gmail。
我正在使用substr()函数,但我无法在'@'和'。'之间进行选择。
这是我的代码:
SELECT SUBSTR(email, INSTR(email, '@')) AS 'Provider', COUNT(email)
AS 'Count'
FROM Customer
GROUP BY Provider
ORDER BY Count DESC;
我的输出目前看起来像这样:
Provider Count
---------- ----------
@gmail.com 8
@hotmail.c 4
@shaw.ca 3
@aol.com 2
@surfeu.de 2
@uol.com.b 2
@yahoo.com 2
@yahoo.de 2
@yahoo.fr 2
@apple.at 1
@apple.be 1
@apple.com 1
@apple.fi 1
@apple.fr 1
@apple.hu 1
@apple.ie 1
@comcast.c 1
@embraer.c 1
@google.co 1
@jetbrains 1
@jubii.dk 1
@microsoft 1
@rediff.co 1
@riotur.go 1
@rogers.ca 1
@sapo.pt 1
@woodstock 1
@wp.pl 1
@yachoo.ca 1
@yahoo.ar 1
@yahoo.au 1
@yahoo.ca 1
@yahoo.cl 1
@yahoo.es 1
@yahoo.in 1
@yahoo.it 1
@yahoo.nl 1
@yahoo.no 1
@yahoo.pt 1
@yahoo.se 1
@yahoo.uk 1
希望这会给你一个想法,你可以提供帮助! 感谢
答案 0 :(得分:1)
这里的诀窍是INSTR()
无法抵消一定数量;它将返回您指定的任何内容的第一次出现。因此,这是一个问题,因为您希望在电子邮件地址的域部分中找到第一个点的位置,但在 at符号后发生。
在下面的查询中,工作单元是以下子字符串:
SUBSTR(email, INSTR(email, '@') + 1)
这会找到at符号右侧的所有内容。然后,我们在其上使用INSTR()
来对at符号和第一个点之间的所有内容进行子串。
SELECT
SUBSTR(SUBSTR(email, INSTR(email, '@') + 1),
1,
INSTR(SUBSTR(email, INSTR(email, '@') + 1), '.') - 1) AS Provider,
COUNT(*) AS p_count
FROM Customer
GROUP BY
SUBSTR(SUBSTR(email, INSTR(email, '@') + 1),
1,
INSTR(SUBSTR(email, INSTR(email, '@') + 1), '.') - 1)
ORDER BY COUNT(*) DESC
我无法为您提供SQLite的实时演示,但在MySQL中,INSTR()
和SUBSTR()
函数的行为几乎相同,上述查询似乎完全可移植。
如果希望查询显得更清晰,可以包装子查询以避免在GROUP BY
子句中重复丑陋的子字符串操作:
SELECT
t.Provider, COUNT(*) AS p_count
FROM
(
SELECT
SUBSTR(SUBSTR(email, INSTR(email, '@') + 1),
1,
INSTR(SUBSTR(email, INSTR(email, '@') + 1), '.') - 1) AS Provider,
FROM Customer
) t
GROUP BY t.Provider