TSQL 到 return 存在的东西

TSQL to return what exists

这是对此的后续问题

我的情况如下

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)

我可以运行下面的查询

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

其中returns以下

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

但是是否可以查看 returns 1 对于 doesContain 的价值,即 @vendor table、Exists returns一场比赛。

我想要的输出如下

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

使用 LEFT 连接 @transaction@vendorFIRST_VALUE() window 函数得到第一次出现:

Select distinct
    a.descr,
    CASE WHEN b.Vname is not null then 1 else 0 End [doesContain],
    first_value(b.Vname) over (partition by a.descr order by Charindex(b.Vname, a.descr)) containsWhat 
from @transaction a left join @vendor b
on Charindex(b.Vname, a.descr) > 0

参见demo

如果您希望获得交易的供应商列表,您可以使用带有 string_agg 功能的外部申请。

Select 
a.descr,
Case When v.list Is Not Null Then 1 Else 0 End,
v.list
From @transaction a Outer Apply
    (Select String_AGG(b.vName,', ') As list From @vendor b
     Where PatIndex(Concat('% ',b.Vname,' %'), a.descr) > 0 Or
           PatIndex(Concat(b.Vname,' %'), a.descr) > 0 Or
           PatIndex(Concat('% ',b.Vname), a.descr) > 0) v

在供应商和交易之间使用叉积,然后使用 charindex 查看供应商名称是否在描述中。如果您有多个供应商,这种方法很有效。

declare @vendor as table (vName varchar(max))
insert into @vendor
select distinct *
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)

select trans.descr,vend.vName vName,
case when charindex(vend.vName,trans.descr)>0 then 1 else 0 end doesContain
from @transaction trans
cross apply @vendor vend
order by descr,vName

输出

ACCR Accro  Accro   1
ACCR Accro  Maccro  0
Maccro indeed   Accro   0
Maccro indeed   Maccro  1
Raac else   Accro   0
Raac else   Maccro  0
lrec Accro Maccro   Accro   1
lrec Accro Maccro   Maccro  1
lrec Maccr0 Accro   0
lrec Maccr0 Maccro  0
recl Maccro something   Accro   0
recl Maccro something   Maccro  1