我有一个名为FileList的表,它有一个列,其中包含一个文件名列表(没有标准命名约定),类似于以下内容:
FileName
--------------------
\Brady_John\Direct Deposit and Voided Check.pdf
\Brady_John\Handbook Acknowledgement Form.pdf
\Brady_John\W-4, 2017.pdf
\Brady_John\Direct Deposit Change.pdf
\Brady_John\EE Handbook Certificate-May 2019.pdf
\Smith_Mary\Direct, Direct Deposit_chase.pdf
\Smith_Mary\2015 W4.pdf
\Smith_Mary\Illinois State Witholding Form.pdf我正试图从这些名字中规范化和提取相关数据。例如,如果文本"w-4“、"w4”或"w“出现在文件名中,则可能是"W-4形式”。这样做的一个基本和有限的例子是:
SELECT FileName
,CASE
WHEN FileName LIKE '%W-4%'
OR FileName LIKE '%W4%'
OR FileName LIKE '%Witholding%'
THEN 'Form W-4'
ELSE NULL
END AS DocType1
,CASE
WHEN FileName LIKE '%Deposit%'
THEN 'Direct Deposit Form'
ELSE NULL
END AS DocType2
,CASE
WHEN FileName LIKE '%Handbook%'
THEN 'Handbook Acknowledgement'
ELSE NULL
END AS DocType3
FROM FileList但是,使用CASE语句会创建单独的列(我只想要一个名为DocType的列),如果我想处理几百个匹配的情况,就不是很容易管理。我试图找到一种方法来使用辅助匹配表来提供选项,以找到适当的文档类型,如下所示:
MatchedWord DocType
-------------- ------------------------
W-4 Form W-4
W4 Form W-4
Witholding Form W-4
Deposit Direct Deposit Form
Handbook Handbook Acknowledgement我意识到,如果我能够解决这个问题,我需要处理匹配的优先级顺序,但就目前而言,我所关心的只是尝试创建和使用这个匹配表。请注意,存储过程和游标不是首选的,但如果没有其他选项,则将被接受。
发布于 2020-02-05 18:07:31
您可以维护一个映射表。
请注意IsNull(...,'Undefined'),这将引发任何问题
示例
Declare @YourTable Table ([FileName] varchar(50))
Insert Into @YourTable Values
('\Brady_John\Direct Deposit and Voided Check.pdf')
,('\Brady_John\Handbook Acknowledgement Form.pdf')
,('\Brady_John\W-4, 2017.pdf')
,('\Brady_John\Direct Deposit Change.pdf')
,('\Brady_John\EE Handbook Certificate-May 2019.pdf')
,('\Smith_Mary\Direct, Direct Deposit_chase.pdf')
,('\Smith_Mary\2015 W4.pdf')
,('\Smith_Mary\Illinois State Witholding Form.pdf')
Declare @Mapping table (KeyPhrase varchar(50),MapTo varchar(50))
Insert Into @Mapping values
('W-4','Form W-4')
,('W4' ,'Form W-4')
,('Witholding' ,'Direct Dep Form')
,('Handbook' ,'Handbook Ackknowlegement')
,('Deposit' ,'Direct Deposit Form')
Select A.*
,DoctType = IsNull(B.MapTo,'Undefined')
From @YourTable A
Left Join @Mapping B on charindex(KeyPhrase,FileName)>0返回
FileName DoctType
\Brady_John\Direct Deposit and Voided Check.pdf Direct Deposit Form
\Brady_John\Handbook Acknowledgement Form.pdf Handbook Ackknowlegement
\Brady_John\W-4, 2017.pdf Form W-4
\Brady_John\Direct Deposit Change.pdf Direct Deposit Form
\Brady_John\EE Handbook Certificate-May 2019.pdf Handbook Ackknowlegement
\Smith_Mary\Direct, Direct Deposit_chase.pdf Direct Deposit Form
\Smith_Mary\2015 W4.pdf Form W-4
\Smith_Mary\Illinois State Witholding Form.pdf Direct Dep Form发布于 2020-02-05 17:44:48
一个案例表达式可以有多个条件。您只需要将它们组合在一起,而不是将每种类型作为单独的列。就像这样。
SELECT FileName
,CASE
WHEN FileName LIKE '%W-4%'
OR FileName LIKE '%W4%'
OR FileName LIKE '%Witholding%'
THEN 'Form W-4'
WHEN FileName LIKE '%Deposit%'
THEN 'Direct Deposit Form'
WHEN FileName LIKE '%Handbook%'
THEN 'Handbook Acknowledgement'
ELSE NULL
END AS DocType
FROM FileList-编辑--
因为您希望在表中有条件,所以只需创建一个包含两列的表。一个用于要查找的值,另一个用于要返回的值。然后加入到那张桌子上。因为这应该是一次性的,所以您只需在连接中使用通配符即可。
https://stackoverflow.com/questions/60081259
复制相似问题