How to extract multiple strings from single rows in SQL Server

前端 未结 3 1158
暖寄归人
暖寄归人 2020-12-19 23:01

I have e.g. the following table data:

id    |    text
--------------------------------------------------------------------------------
1     |  Peter (Peter@         


        
相关标签:
3条回答
  • 2020-12-19 23:27

    You can use a cte recursively to strip out the strings.

    declare @T table (id int, [text] nvarchar(max))
    
    insert into @T values (1, 'Peter (Peter@peter.de) and Marta (marty@gmail.com) are doing fine.')
    insert into @T values (2, 'Nothing special here')
    insert into @T values (3, 'Another email address (me@my.com)')
    
    ;with cte([text], email)
    as
    (
        select
            right([text], len([text]) - charindex(')', [text], 0)),
            substring([text], charindex('(', [text], 0) + 1, charindex(')', [text], 0) - charindex('(', [text], 0) - 1) 
        from @T
        where charindex('(', [text], 0) > 0
        union all
        select
            right([text], len([text]) - charindex(')', [text], 0)),
            substring([text], charindex('(', [text], 0) + 1, charindex(')', [text], 0) - charindex('(', [text], 0) - 1) 
        from cte
        where charindex('(', [text], 0) > 0
    )
    select email
    from cte
    

    Result

    email
    Peter@peter.de
    me@my.com
    marty@gmail.com
    
    0 讨论(0)
  • 2020-12-19 23:33

    THe substring functions have starting position parameter. So you find the first occurrence,and start the next search (in your loop) at the occurrence position + occurenceLength. You'd need to write a function that returns the values either as a delimited string or table. Use the @-sign to find your way into the email address, and then scan backwards and forwards until you reach white space or a character that's invalid in an email address (or the start-pos or the beginning or the last char).

    0 讨论(0)
  • 2020-12-19 23:37

    This assumes there are no rogue parentheses and you would need to add some additional replaces in if your text can contain any XML entity characters.

    WITH basedata(id, [text])
         AS (SELECT 1, 'Peter (Peter@peter.de) and Marta (marty@gmail.com) are doing fine.'
             UNION ALL
             SELECT 2, 'Nothing special here'
             UNION ALL
             SELECT 3, 'Another email address (me@my.com)'),
         cte(id, t, x)
         AS (SELECT *,
                    CAST('<foo>' + REPLACE(REPLACE([text],'(','<bar>'),')','</bar>') + '</foo>' AS XML)
             FROM   basedata)
    SELECT id,
           a.value('.', 'nvarchar(max)') as address
    FROM   cte
           CROSS APPLY x.nodes('//foo/bar') as addresses(a) 
    
    0 讨论(0)
提交回复
热议问题