1
A
回答
1
您需要實現一個用於分割值的函數。有很多變化,你可以使用這個:
CREATE FUNCTION [dbo].[fn_Analysis_ConvertCsvListToNVarCharTableWithOrder](@List nvarchar(max), @Delimiter nvarchar(10) = ',')
RETURNS @result TABLE
(
[Value] nvarchar(max),
[SortOrder] bigint NOT NULL
)
AS
BEGIN
IF @Delimiter is null
BEGIN
SET @Delimiter = ','
END
DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@List, @Delimiter, ']]></r><r><![CDATA[') + ']]></r>'
DECLARE @BufTable TABLE (Value nvarchar(max), SortOrder bigint NOT NULL IDENTITY(1, 1) PRIMARY KEY)
INSERT INTO @BufTable (Value)
SELECT Tbl.Col.value('.', 'nvarchar(max)')
FROM @xml.nodes('//r') Tbl(Col)
OPTION (OPTIMIZE FOR (@xml = NULL))
INSERT INTO @result (Value, SortOrder)
SELECT Value, SortOrder
FROM @BufTable
RETURN
END
具有這樣的功能,它很容易:
DECLARE @DataSource TABLE
(
[column] VARCHAR(1024)
);
DECLARE @column VARCHAR(1024) = '1,2,3,4';
INSERT INTO @DataSource ([column])
VALUES ('100,200,300')
,('100,1,500')
,('1,2,3,500')
,('200')
,('33,32,31,4,30');
SELECT DISTINCT [column]
FROM @DataSource
CROSS APPLY [dbo].[fn_Analysis_ConvertCsvListToNVarCharTableWithOrder] ([column], ',') DSV
INNER JOIN [dbo].[fn_Analysis_ConvertCsvListToNVarCharTableWithOrder] (@column, ',') FV
ON DSV.[Value] = FV.[Value];
使用CROSS APPLY
我們正在分裂爲每列的值。然後,我們分割過濾值並執行INNER JOIN
,以便僅匹配包含在過濾器值中的值的行。之後,我們需要一個DISTINCT
,因爲列值可能包含許多來自過濾器的值。
1
一個T-SQL字符串的「分流」是你需要什麼,但我會不使用mTVF上面推薦的,因爲它是非常低效並殺死並行。內聯表值函數(iTVF)就是你想要分割字符串的東西。
我會建議使用delimitedSplit8k或delimitedSplit8k_lead這將執行〜30-90倍更快;或STRING_SPLIT如果您使用的是SQL 2016+,只需要數百倍的數值。請注意,此性能測試:
-- sample data
declare @rows int = 10000;
if object_id('tempdb..#strings') is not null drop table #strings;
select top (@rows)
someid = identity(int,1,1),
somestring = replace(right(left(cast(newid() as varchar(36)), 27),21),'-',',')
into #strings
from sys.all_columns a, sys.all_columns b;
-- Performance test
set nocount on;
print 'fn_Analysis_ConvertCsvListToNVarCharTableWithOrder'+char(10)+replicate('-',50);
go
declare @st datetime = getdate(), @item varchar(10);
select @item = [value]
from #strings t
cross apply dbo.fn_Analysis_ConvertCsvListToNVarCharTableWithOrder(t.somestring,',');
print datediff(ms,@st,getdate());
go 5
print 'delimitedSplit8K (serial)'+char(10)+replicate('-',50);
go
declare @st datetime = getdate(), @item varchar(10);
select @item = item
from #strings t
cross apply dbo.DelimitedSplit8K(t.somestring,',')
option (maxdop 1);
print datediff(ms,@st,getdate());
go 5
print 'delimitedSplit8K (parallel)'+char(10)+replicate('-',50);
go
declare @st datetime = getdate(), @item varchar(10);
select @item = item
from #strings t
cross apply dbo.DelimitedSplit8K(t.somestring,',')
option (recompile, querytraceon 8649);
print datediff(ms,@st,getdate());
go 5
結果
fn_Analysis_ConvertCsvListToNVarCharTableWithOrder
--------------------------------------------------
Beginning execution loop
4183
4274
4536
4294
4406
Batch execution completed 5 times.
delimitedSplit8K (serial)
--------------------------------------------------
Beginning execution loop
50
50
50
54
53
Batch execution completed 5 times.
delimitedSplit8K (parallel)
--------------------------------------------------
Beginning execution loop
133
134
133
140
136
Batch execution completed 5 times.
你怎麼可以用它來解決你的問題
declare @sometable table(someid int identity, someNbr tinyint);
insert @sometable values (1),(3),(6),(12),(7),(15),(19);
declare @searchstring varchar(1000) = '1,2,3,4,19';
select someid, someNbr
from @sometable t
cross apply dbo.DelimitedSplit8K(@searchstring,',') s
where t.someNbr = s.Item;
結果
someid someNbr
----------- -------
1 1
2 3
7 19
相關問題
- 1. 包含逗號分隔值的sql列
- 2. 如何檢查爆炸只包含逗號分隔值...?
- 3. SQL逗號分隔值
- 4. 動態SQL逗號分隔值查詢
- 5. SQL查詢與逗號分隔值
- 6. 如何查找包含逗號分隔值的記錄?
- 7. 逗號分隔值分隔
- 8. 逗號分隔值單倒引號和逗號分隔值
- 9. 逗號分隔值
- 10. 查詢排序包含在MySQL逗號分隔值
- 11. SQL查詢來從逗號檢索值分隔欄
- 12. 分割(含有還包含逗號值)
- 13. 在SQL Server替換逗號分隔值
- 14. SQL服務器:2逗號分隔值
- 15. 逗號逗號分隔值在Oracle中
- 16. 檢查值以逗號分隔存在列表
- 17. 如何拆分逗號分隔變量?
- 18. 解析逗號分隔值
- 19. 生成逗號分隔值
- 20. 用逗號分隔值
- 21. 排序逗號分隔值
- 22. 閱讀逗號分隔值
- 23. Ant LineContains逗號分隔值
- 24. 計數逗號分隔值
- 25. 讀逗號分隔值
- 26. 讀逗號分隔值
- 27. 逗號分隔值計數
- 28. retrive逗號分隔值
- 29. 地帶逗號分隔值
- 30. 搜索記錄包含逗號分隔的值,包含給定列表中的任何元素
永遠不要將數據存儲爲逗號分隔的項目,它只會導致很多麻煩。 – jarlh
添加一些示例數據和所需的結果。 –
提供表B的樣本數據 –