【发布时间】: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表达式。 -
非常感谢。这是惊人的。在您分享之前,我不知道如何搜索单词 :-)
标签: sql-server tsql