我有一个只有1列包含字符串的表。我只想获取电子邮件地址。我怎样才能做到这一点?我查看了Substring / Ltrim等,但我还没有能够拼凑出如何只提取字符串的一部分。我对SQL很新。谢谢你的帮助!
Column1:
John Smith Email: John.Smith@987456email.com Terminate:
Jacqueline Ryan Email: Jacqueline.Ryan@987456email.com Terminate:
答案 0 :(得分:7)
假设电子邮件的前缀为Email:
并且不包含空格,您可以在Email:
之后和下一个空格(或字符串结尾)之前获取所有字符;
SELECT CASE WHEN CHARINDEX(' ', a.em) <> 0
THEN SUBSTRING(a.em, 1, CHARINDEX(' ', a.em) - 1)
ELSE a.em END email
FROM (
SELECT SUBSTRING(column1, CHARINDEX('Email: ', column1) + 7, LEN(column1)) em
FROM mytable
) a
子查询在Email:
之后保留任何内容,外部查询会切断跟踪下一个空格(或字符串结尾)的所有内容。
该查询假定存在Email:
标记,如果无法保证,则您希望使用WHERE
来确保只有返回。
答案 1 :(得分:3)
我对你的数据做了一些假设,即字符'Name:'没有出现在名字之前,每行都包含子字符串'Terminate:'
在SQL Server中,使用PATINDEX,CHARINDEX和SUBSTRING的组合来解析每行中字符串的地址。光标让您循环遍历表格。这将打印出表格中的所有电子邮件地址。它需要格式化,如果要搜索特定人员的电子邮件,则必须使用WHERE子句修改select语句。我希望这会有所帮助:
将@strung声明为nvarchar(255) ,@ start as int ,@ end as int ,@ result as int ,@ emailCursor Cursor
设置@emailCursor = CURSOR FORWARD_ONLY STATIC READ_ONLY FOR 选择yourColumnName 来自yourTableName
OPEN @emailCursor
FETCH NEXT FROM @emailCursor INTO @strung
WHILE @@FETCH_STATUS = 0
BEGIN
set @start = (select charindex(':',@strung)+1);
set @end = (SELECT PATINDEX('%Terminate:%', @strung)-1)
set @result = @end-@start
set @address = (select SUBSTRING(@strung, @start, @result ) AS eMailAddress)
print @address
FETCH NEXT FROM @emailCursor INTO @strung
END
CLOSE @emailCursor
DEALLOCATE @emailCursor
CHARINDEX返回字符串中第一个':'字符的位置(EMAIL后面的那个)。我在该值上添加了一个,让您超越':'
PATINDEX返回子串“终止”
的起始位置SUBSTRING返回起始位置[CHARNINDEX(':',@ strung)]和'终止'之前的空格之间的所有字符[PATINDEX('%Terminate:%',@ strung)]
答案 2 :(得分:1)
http://sqlfiddle.com/#!6/5ce48/8/0
select ltrim(rtrim(substring(column1,patindex(column1,':')+1, len(column1)-patindex(column1,':')-11))) as email
from t;
假设Terminate:是一致的,first:表示要删除的第一个字符的结尾。
它的作用:
SUBSTRING()
根据特定的起始字符和结束字符取出字符串。 PATINDEX()
并为空格添加2 1,将1移动到起始字符。这为我们提供了SUBSTRING()
SUBSTRING()
中我们取整个字符串的LEN()
中的字符数,从中减去第一个&#39;之前的所有内容的长度:&#39; + 1和&#39;的长度终止:&#39; (11)这个HEAVILY再次假定格式一致。如果它不是&#39;:空间&#39;和&#39;终止:&#39;没有空格,这不起作用。
答案 3 :(得分:0)
这也可以...
declare @data varchar(100) = 'John Smith Email: John.Smith@987456email.com
Terminate:'
select SUBSTRING(@data, PATINDEX('%Email%', @data)+7, PATINDEX('%com%', @data)-
PATINDEX('%Email%', @data)-4)