【发布时间】:2018-08-14 11:58:56
【问题描述】:
我试图使用一个函数作为练习,其中我有 2 个由 ; 分隔的字符串(例如:'1;22;333;444;;5555;666')和另一个格式相同的字符串。
我想检查在大数据集的情况下,两个字符串中是否有相同的元素
例子
@string1 : 'a','b','c'
@string2 : 'a','g','c'
在这种情况下,我希望答案为假,因为 B 和 C 不在第二个字符串中。
示例 2
@string1 : 'a','b','c'
@string2 : 'a','b','c'
在这种情况下,答案将是正确的。
到目前为止,我正在做这样的事情:
CREATE FUNCTION dbo.fnSplit(
@sInputList VARCHAR(8000), -- List of delimited items
@sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
)
RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0
BEGIN
SELECT
@sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1, CHARINDEX(@sDelimiter, @sInputList, 0) - 1))),
@sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList, CHARINDEX(@sDelimiter, @sInputList, 0) + LEN(@sDelimiter), LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List
SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List
SELECT @sInputList -- Put the last item in
RETURN
END
GO
select * from dbo.fnSplit('1;22;333;444;;5555;666', ';')
导致
1
22
333
444
5555
666
然后我有另一个导致错误的函数:
CREATE FUNCTION dbo.fnSplitFinal(
@sInputList VARCHAR(8000) -- List of delimited items (source string)
, @sInputList2 VARCHAR(8000) -- List of delimited items2(target string)
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items source
, @sDelimiter2 VARCHAR(8000) = ',' -- delimiter that separates items target
) RETURNS Integer
BEGIN
DECLARE @list1 TABLE (item VARCHAR(8000));
DECLARE @list2 TABLE (item VARCHAR(8000));
DECLARE @listFinal TABLE (item VARCHAR(8000), item2 Varchar(8000), Istrue varchar(50)) ;
--source
Insert Into @list1 (Item)
select * from master.dbo.fnSplit(@sInputList, ';')
--target
Insert Into @list2 (Item)
select * from Master.dbo.fnSplit(@sInputList2,';')
--final
insert Into @listFinal (Item, item2, istrue)
select a.item , b.item,
Case
when a.item = b.item then 'true'
when a.item != b.item then 'false'
when a.item is not NULL and b.item is NULL then 'falseNULL'
else 'cc'
end as Istrue
from @list1 --> error here, out of scope?
left Join @list2
on @list1.item = List2.item
Declare @result Integer
select @result = (select count(*) from @listFinal where isTrue !="true" )
RETURN @result
END
GO
这显示错误“必须声明一个标量变量@list1”
任何帮助都是有价值的,并且会带来新的学习!
【问题讨论】:
-
错误查询中的 a 和 b 别名是什么?
-
我强烈建议您将当前的拆分功能扔进垃圾桶。有许多选项比使用 while 循环更适合拆分字符串。这里有几个。 sqlperformance.com/2012/07/t-sql-queries/split-strings
标签: sql sql-server tsql stored-procedures stored-functions