选择多个case语句仅返回第一个case表达式值

时间:2014-10-13 12:24:48

标签: sql sql-server select case coalesce

考虑下面的代码;从一个长串中,数字和字母都应该只返回电子邮件(该字符串包含姓名,电话号码,电子邮件等)。

原始字符串可以包含电话号码,电子邮件等,看起来像是相反的: [falsefalse070-123456789given-name.surname@gmail.comTrueTrue]

我希望最终结果只显示电子邮件地址,如下所示: [given-name.surname@gmail.com]

第一个case语句删除嵌入在一串数字中的所有“ - ”符号,但不包含嵌入在字符串中的那些符号(即删除“070-123456789”中的“ - ”但不删除“给定名称...” gmail.com”。

第二个case语句删除了字符串的13个第一个位置中可能存在的所有数字。

如果我运行下面的代码,只会考虑第一个case语句。结果是:"070123456789given-name.surname@gmail.com"。如果我在case语句中更改位置,结果为:"-given-name.surname@gmail.com"

“from”-code中的select语句选择变量[user_account]下的电话号码和电子邮件。它工作正常!它是代码的第一部分,带有2个case语句,这是错误的。

如何编写代码以便两个case语句都有效?

SELECT COALESCE(
CASE    
    WHEN PATINDEX('%[-]%',C.[user_account]) <= patindex('%[ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ]%',C.[user_account]) AND PATINDEX('%[-]%',C.[user_account]) > 0
    THEN replace(substring(C.[user_account],PATINDEX('%[-]%',C.[user_account]),1),'-','') + SUBSTRING(C.[user_account],(PATINDEX('%[-]%',C.[user_account])+1),80) 
    ELSE C.[user_account]
END,
CASE
    WHEN SUBSTRING(C.[user_account],1,13) LIKE '%0%' OR SUBSTRING(C.[user_account],1,13) LIKE '%1%' OR SUBSTRING(C.[user_account],1,13) LIKE '%2%' OR SUBSTRING(C.[user_account],1,13) LIKE '%3%' OR SUBSTRING(C.[user_account],1,13) LIKE '%4%' OR SUBSTRING(C.[user_account],1,13) LIKE '%5%' OR SUBSTRING(C.[user_account],1,13) LIKE '%5%' OR SUBSTRING(C.[user_account],1,13) LIKE '%6%' OR SUBSTRING(C.[user_account],1,13) LIKE '%7%' OR SUBSTRING(C.[user_account],1,13) LIKE '%8%' OR SUBSTRING(C.[user_account],1,13) LIKE '%9%' OR SUBSTRING(C.[user_account],1,13) LIKE '% %'
    THEN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(C.[user_account],1,13),'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9',''),' ','')/*,'-','')*/ + SUBSTRING(C.[user_account],14,80) 
    ELSE C.[user_account]
END)
AS [user_account]


from
(SELECT 
    A.username as unit_id
    ,LEFT(B.string, CHARINDEX('<',B.string)-1) as [Användarnamn]
    ,REVERSE(LEFT(REVERSE(B.string), CHARINDEX('>', REVERSE(B.string)) -1)) as [user_account]
FROM [statistics].[dbo].[users] A
INNER JOIN (
SELECT  
    [UserId]
    ,REPLACE(REPLACE(REPLACE(CAST([PropertyValuesString] as varchar (200)),'False',''),'True',''),'Fals','') as string
FROM [statistics].[dbo].[Profile]) B
ON A.userid=B.userid) C
where unit_id='KN2281'

非常感谢,

干杯!

0 个答案:

没有答案