TSQL 搜索文本

Posted

技术标签:

【中文标题】TSQL 搜索文本【英文标题】:TSQL to search text 【发布时间】:2021-08-11 17:30:20 【问题描述】:

我的情况如下

declare @vendor as table (vName varchar(max))
insert into @vendor
select *
from
(
    values
        ('Maccro'),
        ('Accro')
) t (one)

declare @transaction as table (descr varchar(max))
insert into @transaction
select *
from
(
    values
        ('recl Maccro something'),
        ('lrec Accro Maccro'),
        ('lrec Maccr0'),
        ('Maccro indeed'),
        ('ACCR Accro'),
        ('Raac else')
) t (one)

我想运行一个查询,它将在@transaction 的每个行值中搜索来自@vendor 的每个值,如果该值包含在descr 中,则在匹配第一个值时返回 1。

所以在我的例子中,我想要的结果如下

| descr                 | doesContain |
| --------------------- | ----------- |
| recl Maccro something | 1           |
| lrec Accro Maccro     | 1           |
| lrec Maccr0           | 0           |
| Maccro indeed         | 1           |
| ACCR Accro            | 1           |
| Raac else             | 0           |

我尝试通过编写 CASE 语句来做到这一点,但这意味着我需要为每个供应商手动编写该语句,这是不可能的,因为供应商表是动态且复合的。

这是我迄今为止尝试过的

select 
a.descr,
CASE WHEN a.descr like '%Maccro%' then 1 else 0 end [doesContain]
from @transaction a

【问题讨论】:

所以你不想搜索单词?您希望 'foo' 匹配 'foo''football''barfood',...而不管单词边界。 我希望 foo 只匹配 foo 而不是 football 那么你需要一个更好的答案。更好的问题更容易。单词 always 是否由一个空格分隔,即您从来没有'Playing soccer (football),rugby and tennis.'?向两个字符串添加唯一的分隔符(一个空格)将确保单词匹配,即' ' + descr + ' ' like '% ' + vname + ' %'。或者,您可以使用String_Split() 将描述分解为单词,join 将它们与供应商名称一起使用,String_Agg() 将匹配项组合起来回答您的下一个问题。如果你有更多的标点符号要处理,那就更难了。这是一个case 表达式 非常感谢。这是惊人的。在您分享之前,我不知道如何搜索单词 :-) 【参考方案1】:

试试这样:

Select 
    a.descr,
    CASE WHEN EXISTS(select * From @vendor b
                     where Charindex(b.Vname, a.descr) > 0)
              then 1 else 0 End [doesContain]
from @transaction a

【讨论】:

我有一个后续问题,我问了here。是否也可以查看@vendor tbl、EXISTS 中的什么值返回匹配项? @smpa01 如果匹配不止一个怎么办? 如果匹配不止一次,则只返回第一个值,即containsWhat将返回Accro for lrec Accro Maccro

以上是关于TSQL 搜索文本的主要内容,如果未能解决你的问题,请参考以下文章

如何对大文本文件运行字典搜索?

VB关于搜索文本的代码···

Swift:由字符串分隔的组件

绕过 TSQL CONTAINS 过滤

快速入门系列--TSQL-01基础概念

QT中怎样读取中文文本文件!