2009-09-17 36 views
0
select left(emailaddress, len(emailaddress) - charindex('@', emailaddress)) 

我得到如下结果:如何从字符串[email protected]中提取字符串'foo'?

[email protected] 

请更正以下select语句。我需要用电子邮件地址的语气来做到这一点,并只提取用户名。

+0

删除了您的真实电子邮件,以防万一,如果我错了,随时加回来;没有意见分享您的电子邮件地址(如果是)垃圾邮件发送者得到:) – 2009-09-17 14:27:00

回答

9

你在不经意间重新实施“右”那里:)

试试这个:

select left(emailaddress, charindex('@', emailaddress) - 1) 

它寻求@的位置,并采取字符数最多,但不包括(这是- 1@符号。

请注意不具有@的字符串;你会得到一个空字符串。

+0

我不知道,为什么-1? charindex给出了一个索引,剩下的长度据我了解? – StampedeXV 2009-09-17 14:20:08

+0

Ayup。 Charindex从左开始计数,所以如果你想要字符串的左边部分,就减去1,这样你就不会包含搜索字符(@)本身。如果您需要字符串的* right *部分,即*搜索字符后面的*,则只需要字符串的长度。 – Martha 2009-09-17 14:21:05

+0

例如:[email protected] charindex返回1 left([email protected],1)返回 - >我们想要的。所以我们不需要减号1. – StampedeXV 2009-09-17 14:24:20

0

只是一个猜测。我没有任何访问sql-server的权限,不熟悉它。但是......

你试过:

select left(emailaddress, charindex('@', emailaddress)) 
+3

这将包括@字符,您需要减去1以获得所有字符但不包括搜索字符 – Martha 2009-09-17 14:23:00

+0

实际上,这取决于字符串是零索引还是单索引。如果为零索引,charindex返回3,那么您会得到3个左边的字符。基于1的字符串将返回4,因此它将包含'@'。 – 2009-09-17 14:29:35

+0

但是在TransactSQL中,charindex是基于1的!请参阅http://msdn.microsoft.com/en-us/library/ms186323.aspx – 2009-09-17 14:32:04

0
select left(emailaddress, charindex('@', emailaddress)-1) 
1

如果您需要吨做到这一点(或吨,但肯定不是色调)的电子邮件地址和/或你正在做的经常,恰当的时间是数据进入表格(通过使用插入/更新触发器)并在该点将其分成两列。这样,它只会在需要时发生,而不是每次在桌上进行选择。

数据几乎是总是读取的次数比写入的要多,通过在插入/更新时分割,可以最大限度地减少要完成的工作量。每行函数从不能很好地扩展,因为表格变得更大,并且简单连接两列的成本要比根据字符分隔符分割它们要小得多。

其他答案已经告诉你如何做拆分。我的观点是你在错误的时间做这件事。当然,如果模式更改不在问题中,请忽略此响应。但在我看来,这将是最好的选择。

相关问题