如何在SQL中只返回不同长度的字符串的一部分?

时间:2014-09-16 18:18:01

标签: sql sql-server tsql

我有一个只有1列包含字符串的表。我只想获取电子邮件地址。我怎样才能做到这一点?我查看了Substring / Ltrim等,但我还没有能够拼凑出如何只提取字符串的一部分。我对SQL很新。谢谢你的帮助!

Column1:

John Smith     Email: John.Smith@987456email.com  Terminate:

Jacqueline Ryan    Email: Jacqueline.Ryan@987456email.com     Terminate:

4 个答案:

答案 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来确保只有返回。

An SQLfiddle to test with

答案 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:表示要删除的第一个字符的结尾。

它的作用:

  1. 它使用SUBSTRING()根据特定的起始字符和结束字符取出字符串。
  2. 要确定起始字符,我们会首先查找:使用PATINDEX()并为空格添加2 1,将1移动到起始字符。这为我们提供了SUBSTRING()
  3. 的初始药剂
  4. 要确定SUBSTRING()中我们取整个字符串的LEN()中的字符数,从中减去第一个&#39;之前的所有内容的长度:&#39; + 1和&#39;的长度终止:&#39; (11)
  5. 这个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)