根据名称建议电子邮件

时间:2012-11-22 19:06:51

标签: sql sql-server sql-server-2008

我正在尝试在SQL Server 2008上进行查询,该查询根据FullName表的Person列获取电子邮件建议。

例如:对于名为Person的{​​{1}},查询应返回Rodrigo David Waltenberg

但我不知道如何分割全名和全部小写。全名也可能有中间名,但我只需要名字和姓氏。任何人都知道如何使用SQL?

1 个答案:

答案 0 :(得分:2)

利用Google的魔法权力经常会有很大帮助

"MS SQL lowercase string", 1st hit

LOWER ( character_expression )

将字符串转换为小写。

"MS SQL replace string", 1st hit

 REPLACE ( string_expression , string_pattern , string_replacement )

用你在给定字符串中指定的另一个字符串替换你想要的任何东西......

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

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

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

如果这还不够,只有第一部分和最后一部分都是neededed,那么中间部分就是一块蛋糕了。

第1步:  "MS SQL index of char in string", first hit

CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] ) 

第2步:

"MS SQL leftmost characters of string", first hit

LEFT ( character_expression , integer_expression )

第3步:

"MS SQL rightmost characters of string", first hit

RIGHT ( character_expression , integer_expression )

第4步:

"MS SQL reverse string", first hit

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

仍然记得做研究并在发帖前做尝试