无法选择两个字符SQLite3之间的确切字符串

时间:2017-05-28 11:37:35

标签: string sqlite grouping

我想创建一个列表来计算电子邮件提供商的数量,无论指定的是哪个国家/地区代码。即,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

希望这会给你一个想法,你可以提供帮助! 感谢

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

Demo