我正在使用SQL Server 2012。
我想将Table1中的不同项目拆分,以与Table2的特定列进行比较。
Table1有一行:
| id | items |
| 1 | aaa;ery;sha;cbre;dezrzyg; |
| 2 | aaa;ery;sha;cbre;dezrzyg; | // Could be the same items than another row
| 3 | dg;e3ry;sd6ha;cb8re;48dz; |
| 4 | e5zeza;48;dz;46az;12BREd; |
| ... | ... |
| 10 | aaa | // Currently match because the request compare the whole cell
items是一个字符串(db中的ntext
),字符串永远不会包含空格。
表2有一行:
| id | item |
| 1 | aaa | // match
| 2 | AAA | // match
| 3 | aaa52 | // doesn't match
| 4 | 2aaa2 | // doesn't match
| ... | ... |
item也是一个字符串(db中的nvarchar
),字符串永远不会包含空格。
这是我当前的SQL请求:
SELECT * FROM Table1 t1
INNER JOIN Table2 t2 ON t1.items = t2.item
我怎么能解决我的问题?
我应该拆分字符串,然后将每个Table1.items
与Table2.item
进行比较吗?
SQL中有什么东西可以轻松解决它吗?
答案 0 :(得分:3)
SQL中有什么东西可以轻松解决它吗?
不,但您可以创造性地使用like
。当您执行此类操作时,索引无法帮助您提高性能。
select *
from Table1 as T1
inner join Table2 as T2
on ';'+cast(T1.items as nvarchar(max))+';' like '%;'+T2.item+';%'
答案 1 :(得分:0)
故障安全解决方案是将items
列的内容拆分为表格式,然后将其加入table2。
假设我们有这些表:
create table #t1 (id int, items varchar(100));
go
insert #t1 values
( 1, 'aaa;ery;sha;cbre;dezrzyg;'),
( 2, 'aaa;ery;sha;cbre;dezrzyg;'),
( 3, 'dg;e3ry;sd6ha;cb8re;48dz;'),
( 4, 'e5zeza;48;dz;46az;12BREd;'),
(10, 'aaa');
go
create table #t2 (id int, item varchar(100));
go
insert #t2 values
(1, 'aaa'),
(2, 'AAA'),
(3, 'aaa52'),
(4, '2aaa2')
go
我们将使用以下方法拆分items
:
select substring(items, n, charindex(';', items + ';', n) - n)
from numbers, #t1
where substring(';' + items, n, 1) = ';'
and n < len(items) + 1
这需要numbers
表格,请参阅here如何创建表格。
这是整个查询:
select distinct #t1.id, #t1.items, case when #t2.id is null then 'doesn''t match' else 'match' end
from #t1
cross apply (
select substring(items, n, charindex(';', items + ';', n) - n)
from numbers
where substring(';' + items, n, 1) = ';'
and n < len(items) + 1
) x (col)
left join #t2 on x.col = #t2.item
--where #t2.id is not null