簡體   English   中英

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

[英]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來確保只返回已返回的行。

一個要測試的SQLfiddle

我對你的數據做了一些假設,即字符'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:表示要刪除的第一個字符的結尾。

它能做什么:

  1. 它使用SUBSTRING()根據特定的起始字符和結束字符取出字符串。
  2. 為了確定起始字符,我們首先查找:使用PATINDEX()並為空格添加2 1,將1移動到起始字符。 這給了我們SUBSTRING()的起始葯水SUBSTRING()
  3. 為了確定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM