SQL - 将Table1.items(Ntext)与Table2.item(Varchar)进行比较

时间:2014-04-29 13:14:17

标签: sql sql-server sql-server-2012

我正在使用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.itemsTable2.item进行比较吗? SQL中有什么东西可以轻松解决它吗?

2 个答案:

答案 0 :(得分:3)

  

SQL中有什么东西可以轻松解决它吗?

不,但您可以创造性地使用like。当您执行此类操作时,索引无法帮助您提高性能。

select *
from Table1 as T1
  inner join Table2 as T2
    on ';'+cast(T1.items as nvarchar(max))+';' like '%;'+T2.item+';%'

SQL Fiddle

答案 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