1

我的表中有一个名为的列,TO它是一个以逗号分隔的电子邮件地址列表。(1-n)

我不关心一行,如果它只包含 What@mycompany.com 的地址希望将其标记为 0。但是,如果一行包含非 mycompany 地址(即使存在 mycompany 地址)我想将其标记为 1。这可能使用一个 LIKE 语句吗?

我试过了;

AND
    [To]  like '%@%[^m][^y][^c][^o][^m][^p][^a][^n][^y]%.%'

理想的输出将是:

alice@mycompany.com, bob@mycompany.com, malory@yourcompany.com     1
alice@mycompany.com, bob@mycompany.com                             0
malory@yourcompany.com                                             1

如果不可能的话,编写某种解析函数将地址拆分成一个表会更好吗?我没有数据中其他域的详尽列表。

4

2 回答 2

3

这很丑陋,但它有效。case语句比较@符号的出现次数和@mycompany.com的出现次数(XXX..只是为了保持字符串的长度):

select 
    * 
    , flag = case when len(field) - len(replace(replace(field,'@mycompany.com','XXXXXXXXXXXXXX'),'@','')) > 0 then 1 else 0 end 
from (
    select 'alice@mycompany.com, bob@mycompany.com, malory@yourcompany.com' as field union all 
    select 'alice@mycompany.com, bob@mycompany.com' union all 
    select 'malory@yourcompany.com' 
) x
于 2013-03-20T13:25:38.063 回答
2

我会建议一个简单的计数方法。计算“@mycompany”出现的次数并计算逗号的数量。如果这些不同,那么你有一个问题:

 select emails,
        (case when len(emails) - len(replace(emails, ',', '')) = 
                   len(emails) - len(replace(emails, '@mycompany.com', 'mycompany.com'))
              then 0
              else 1
         end) as HasNonCompanyEmail
 from t

为了简化算术,我将“@mycompany.com”替换为“mycompany.com”。这只会删除一个字符。

于 2013-03-20T13:27:29.953 回答