select left(emailaddress, len(emailaddress) - charindex('@', emailaddress))
我得到的结果如下:
foo@ma
请更正下面的选择声明。我需要使用电子邮件地址的音调来执行此操作并仅提取用户名。
答案 0 :(得分:12)
你无意中在那里重新实施“正确”:)
试试这个:
select left(emailaddress, charindex('@', emailaddress) - 1)
它搜索@
的位置,并将字符数加到但不包括- 1
@
符号。
请注意没有@
的字符串;你最终会得到一个空字符串。
答案 1 :(得分:1)
select left(emailaddress, charindex('@', emailaddress)-1)
答案 2 :(得分:1)
如果您需要使用吨(或吨,但肯定不音)电子邮件地址和/或您经常这样做,正确的时间是在数据输入时表(通过使用插入/更新触发器)并在该点将其拆分为两列。这样,它只在需要时发生,而不是每次在桌面上进行选择时都会发生。
数据几乎始终读取的频率远远高于写入数据,因此,通过在插入/更新时拆分,您可以最大限度地减少要完成的工作量。每行函数永远不会随着表变大而缩放,简单地连接两列而不是基于字符分隔符拆分它们的成本要小得多。
其他答案已经告诉你如何进行拆分。我的论点是你在错误的时间做这件事。当然,如果架构更改不可能,请忽略此响应。但是,在我看来,这将是最好的方式。
答案 3 :(得分:0)
只是一个猜测。我没有访问sql-server,也不熟悉它。但...
你试过了吗?
select left(emailaddress, charindex('@', emailaddress))
答案 4 :(得分:0)
在您知道电子邮件地址的域部分将是什么,但您要提取第一部分(即用户名)的情况下,这是一种解决方案。例如,我在一家大学工作,该大学的电子邮件地址为firstname.lastname@college.edu,并且firstname.lastname用作登录用户名。有时我只需要一个用户名列表,但是这些用户名并没有与整个电子邮件地址分开存储在我们的数据库中。所以,我用这个:
REPLACE(email_address,'@college.edu','')