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 搜索文本的主要内容,如果未能解决你的问题,请参考以下文章