在SQL Server 2016+中,您可以使用string_split()
。
在SQL Server預-2016,在common table expression使用由傑夫MODEN一個CSV分路器表值函數cross apply()
:
create table t (ID int,RecordNote varchar(32));
insert into t values
(1,'1:15&2:30&3:40')
,(2,'2:50&1:40&3:50')
,(3,'2:60&1:30&4:50')
,(4,'3:50&1:40&2:60')
,(5,'7:50&2:40&3:60');
create table p (patternId int, Pattern varchar(32));
insert into p values (1,'3:50'),(2,'2:60');
;with cte as (
select
t.Id
, RecordNote = s.Item
, RecordNoteMatches = count(*) over (partition by t.Id)
from t
cross apply dbo.delimitedsplit8K(t.RecordNote,'&') s
inner join p
on p.Pattern = s.Item
)
select *
from cte
where RecordNoteMatches = (select count(*) from p);
rextester 演示:http://rextester.com/KKTR95367
回報:
+----+------------+-------------------+
| Id | RecordNote | RecordNoteMatches |
+----+------------+-------------------+
| 4 | 3:50 | 2 |
| 4 | 2:60 | 2 |
+----+------------+-------------------+
拆分字符串參考:
如果你只是想在Id
S上的比賽,那麼你就可以簡化查詢:
;with cte as (
select
t.Id
, RecordNoteMatches = count(*)
from t
cross apply dbo.delimitedsplit8K(t.RecordNote,'&') s
inner join p
on p.Pattern = s.Item
group by t.Id
)
select *
from cte
where RecordNoteMatches = (select count(*) from p);
rextester 演示:http://rextester.com/RDZWF26107
回報:
+----+-------------------+
| Id | RecordNoteMatches |
+----+-------------------+
| 4 | 2 |
+----+-------------------+
你的根本問題是你錯誤地表示了數據。您不應該將事物列表存儲爲字符串。你應該爲每個TableA.Id和Pattern創建另一個表。 –
最初的模式是在一列'3:50&1:-1&2:60',我想使用此模式搜索,但有一些條件 1-使用ID刪除-1,所以我的模式將是'3:50&2:60 ' 2-刪除&因爲reocrdNotes不存儲& 所以我使用拆分字符串函數來獲取表格中的模式 –