首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -使用选项表执行字符串值的部分匹配

SQL -使用选项表执行字符串值的部分匹配
EN

Stack Overflow用户
提问于 2020-02-05 17:38:20
回答 2查看 80关注 0票数 1

我有一个名为FileList的表,它有一个列,其中包含一个文件名列表(没有标准命名约定),类似于以下内容:

代码语言:javascript
复制
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形式”。这样做的一个基本和有限的例子是:

代码语言:javascript
复制
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的列),如果我想处理几百个匹配的情况,就不是很容易管理。我试图找到一种方法来使用辅助匹配表来提供选项,以找到适当的文档类型,如下所示:

代码语言:javascript
复制
MatchedWord    DocType
-------------- ------------------------
W-4            Form W-4
W4             Form W-4
Witholding     Form W-4
Deposit        Direct Deposit Form
Handbook       Handbook Acknowledgement

我意识到,如果我能够解决这个问题,我需要处理匹配的优先级顺序,但就目前而言,我所关心的只是尝试创建和使用这个匹配表。请注意,存储过程和游标不是首选的,但如果没有其他选项,则将被接受。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-05 18:07:31

您可以维护一个映射表。

请注意IsNull(...,'Undefined'),这将引发任何问题

示例

代码语言:javascript
复制
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

返回

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-02-05 17:44:48

一个案例表达式可以有多个条件。您只需要将它们组合在一起,而不是将每种类型作为单独的列。就像这样。

代码语言:javascript
复制
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

-编辑--

因为您希望在表中有条件,所以只需创建一个包含两列的表。一个用于要查找的值,另一个用于要返回的值。然后加入到那张桌子上。因为这应该是一次性的,所以您只需在连接中使用通配符即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60081259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档