[英]How do I only return part of a string with varying lengths in SQL?
我有一個只有1列包含字符串的表。 我只想獲取電子郵件地址。 我怎樣才能做到這一點? 我查看了Substring / Ltrim等,但我還沒能把如何只提取部分字符串拼湊起來。 我對SQL很新。 謝謝您的幫助!
Column1:
John Smith Email: John.Smith@987456email.com Terminate:
Jacqueline Ryan Email: Jacqueline.Ryan@987456email.com Terminate:
假設電子郵件由前綴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:
外部查詢會切斷跟蹤下一個空格(或字符串結尾)的所有內容。
該查詢假定存在Email:
標記,如果不能保證,您將需要使用WHERE
來確保只返回已返回的行。
我對你的數據做了一些假設,即字符'Name:'沒有出現在名字之前,每行都包含子字符串'Terminate:'
在SQL Server中,使用PATINDEX,CHARINDEX和SUBSTRING的組合來解析每行中字符串的地址。 光標讓您循環遍歷表格。 這將打印出表格中的所有電子郵件地址。 它需要格式化,如果要搜索特定人員的電子郵件,則必須使用WHERE子句修改select語句。 我希望這有幫助:
聲明@strung為nvarchar(255),@ start為int,@ end為int,@ result為int,@ emailCursor Cursor
設置@emailCursor = CURSOR FORWARD_ONLY STATIC READ_ONLY FOR從yourTableName中選擇yourColumnName
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返回子字符串'Terminate'的起始位置
SUBSTRING返回起始位置[CHARNINDEX(':',@ strung)]和'終止'之前的空格之間的所有字符[PATINDEX('%Terminate:%',@ strung)]
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()
SUBSTRING()
中有多少個字符,我們取整個字符串的LEN()
從它中減去第一個':'+ 1之前的所有內容的長度和'Terminate:'(11)的長度 同樣,這個HEAVILY假設格式一致。 如果它不是':space'和'Terminate:'不是帶有空格的11,那么這不起作用。
這也有效......
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.