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
到 @vendor
和 FIRST_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
这是对此的后续问题
我的情况如下
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
到 @vendor
和 FIRST_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