1

我正在尝试在 SQL Server 2008 上进行查询,以获取基于表FullName列的电子邮件建议Person

例如:对于Person命名Rodrigo David Waltenberg的查询应该返回rodrigo.waltenberg@company.com

但我不知道如何将全名拆分并全部小写。全名也可能有中间名,但我只需要名字和姓氏。任何人都知道如何使用 SQL 来做到这一点?

4

1 回答 1

2

利用 Google 的魔力通常会大有帮助

“MS SQL 小写字符串”,第一次命中

LOWER ( character_expression )

将字符串转为小写。

“MS SQL 替换字符串”,第一次命中

 REPLACE ( string_expression , string_pattern , string_replacement )

用您在给定字符串中指定的其他字符串替换您想要的任何内容...

所以只需将两者结合起来,然后这样做:

小写输入,并将空格替换为点:

 REPLACE(LOWER(Fullname), ' ','.')

如果这还不够,只需要第一个和最后一个部分,那么省略中间部分又是小菜一碟。

第 1 步: “字符串中字符的 MS SQL 索引”,首先点击

CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] ) 

第2步:

“MS SQL 最左边的字符串字符”,第一次命中

LEFT ( character_expression , integer_expression )

第 3 步:

“MS SQL 字符串最右边的字符”,首先点击

RIGHT ( character_expression , integer_expression )

第4步:

“MS SQL 反向字符串”,第一次命中

REVERSE ( string_expression )

如果它总是正确的,那么名称至少有两个部分由至少一个空格字符分隔,只需将这些部分连接在一起:

获取输入的第一部分和最后一部分,至少包含两部分,小写,用点连接它们:

LOWER(
    LEFT(Fullname, CHARINDEX(' ',Fullname)-1) + 
    '.' +
    RIGHT(Fullname, CHARINDEX(' ', REVERSE(Fullname))-1)
 ) + '@whatever.com' as suggestion

此外,如果 Fullname 列可以包含前导和尾随空格,请使用 TRIM 删除它们...这会使它变得混乱...

输入字符串任意数量部分的完整解决方案:

CASE 
 --when there are at least two spaces ( optimally 3 names, or double spaces between names)
    WHEN LEN(Fullname)-LEN(REPLACE(Fullname, ' ','')) >1 
    THEN 
        LOWER(
            LEFT(Fullname, CHARINDEX(' ',Fullname)-1) + 
            '.' +
            RIGHT(Fullname, CHARINDEX(' ', REVERSE(Fullname))-1)
         )
    ELSE
    --at most one space in name
        REPLACE(LOWER(Fullname), ' ','.')
END + '@whatever.com' as suggestion

并且请仍然记得在发布问题之前进行研究尝试一些事情。

于 2012-11-22T19:18:00.620 回答