SQL选择与其他值不同的值

0 sql distinct postgresql-9.1

所以我有一个由即时消息应用程序自动生成的表,我正在寻找所有用户发送的所有消息.每个对话都有一个"到"列,问题是它在末尾附加了一个短连接字符串.所以to列看起来像:username @ company.com/id 1111

我希望得到所有不同的用户名和它们出现的次数.任何建议表示赞赏.我正在使用PostgreSQL 9.1.1

Gor*_*off 5

问题是解析字符串.这在很大程度上取决于SQL的方言.这是一种使用MySQL的方法:

select substring_index(`to`, '/', 1) as username, count(*)
from t
group by substring_index(`to`, '/', 1);
Run Code Online (Sandbox Code Playgroud)

在大多数其他SQL方言中,逻辑略有不同.在SQL Server中:

select left("to", charindex('/', "to") - 1) as username, count(*)
from t
group by left("to", charindex('/', "to") - 1);
Run Code Online (Sandbox Code Playgroud)

在其他数据库中,等价物charindex()可能是instr()position().

编辑:

我最初将"用户名"误解为整个电子邮件地址.Barmar指出,问题中的格式确实表明了之前的部分@.只有电子邮件的用户名部分,没有域,似乎很危险.但是,上面的作品,只是通过替换'@''/':

select substring_index(`to`, '@', 1) as username, count(*)
from t
group by substring_index(`to`, '@', 1);

select left("to", charindex('@', "to") - 1) as username, count(*)
from t
group by left("to", charindex('@', "to") - 1);
Run Code Online (Sandbox Code Playgroud)