【发布时间】:2020-06-02 08:56:22
【问题描述】:
我需要一些指导并寻找更好的方法来解析字符串。
示例 1:
字符串:Automation_LOY_Loyalty_PC_CampaignName3-Abandoners-Email1_NoPromo_USA
CSV:自动化、LOY、忠诚度、PC、CampaignName3、Abandoners、Email1、NoPromo、美国
示例 2:
字符串:20200601_LOY_Functional_PC_CampaignName1_NoPromo_CAN
CSV:20200601,LOY,Functional,PC,CampaignName1,,,无促销,CAN
如您所见,有些字符串没有所有字段,所以有些 csv 字段需要留空。
现在我正在使用下面的这段代码,它非常混乱。除了像这样使用 CHARINDEX 之外,还有更好的方法来处理它吗?
SELECT [EmailName]
-- Deployment Type
,CASE LEFT([EmailName], (CHARINDEX('_', [EmailName])) - 1)
WHEN 'Automation' THEN 'Automation'
ELSE 'AdHoc' END AS [Deployment]
-- Type
,SUBSTRING([EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1, CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1) + 1) - CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1) - 1) AS [Type]
-- Customer_Type
,SUBSTRING([EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1) + 1) + 1, CHARINDEX('_', [EmailName],CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1)) - CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) - 1) AS [Customer_Type]
-- Campaign_Name
,CASE WHEN (CHARINDEX('-', [EmailName])) = 0 THEN SUBSTRING([EmailName], (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1))) + 1, (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1)) + 1))) - (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1))) - 1)
WHEN (CHARINDEX('-', [EmailName])) > 0 THEN SUBSTRING([EmailName], (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1))) + 1, ((CHARINDEX('-', [EmailName])) - (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1)))) - 1)
ELSE NULL END AS [Campaign_Name]
,CASE WHEN (CHARINDEX('-', [EmailName])) = 0 THEN 1
WHEN (CHARINDEX('-', [EmailName])) > 0 THEN REPLACE(SUBSTRING([EmailName], ((CHARINDEX('-', [EmailName])) + 1), (CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName], (CHARINDEX('_', [EmailName])) + 1)) + 1) + 1)) + 1))) - (CHARINDEX('-', [EmailName])) - 1),'Email','')
ELSE NULL END AS [Email_Num]
FROM TableName
【问题讨论】:
-
我可以看到你的字符串的格式。你想要什么?示例数据和所需的结果很有帮助。
-
@GordonLinoff 抱歉,csv 所需的结果在那里,但它被格式化在同一行,所以很混乱。