Sql server T-SQL:有没有办法检查一个变量的值是否存在于另一个变量中
代码: 我在这里试图完成的是,我声明了两个VARCHAR类型的变量,并给它们赋值。我声明的第三个变量是从第一个变量派生的子字符串。第三个变量的值,我试图在第二个变量中找到它的存在,如果不是,我尝试将它与第二个变量连接起来 所以@c得到的第一个值是:';2;' 它应该与@b进行比较,如果@b中没有,它应该与@b连接 所以基本上,最终的结果应该是这样的 @b=';2.12;13;9;14;16;17;21;'Sql server T-SQL:有没有办法检查一个变量的值是否存在于另一个变量中,sql-server,tsql,variables,Sql Server,Tsql,Variables,代码: 我在这里试图完成的是,我声明了两个VARCHAR类型的变量,并给它们赋值。我声明的第三个变量是从第一个变量派生的子字符串。第三个变量的值,我试图在第二个变量中找到它的存在,如果不是,我尝试将它与第二个变量连接起来 所以@c得到的第一个值是:';2;' 它应该与@b进行比较,如果@b中没有,它应该与@b连接 所以基本上,最终的结果应该是这样的 @b=';2.12;13;9;14;16;17;21;' 请帮忙。谢谢。如果我正确理解您的问题,我相信您会希望使用集合表而不是字符串。如果绝对必要,
请帮忙。谢谢。如果我正确理解您的问题,我相信您会希望使用集合表而不是字符串。如果绝对必要,可以使用SQL Server 2016中存在的拆分函数使用字符串执行此操作,但必须为以前的版本编写自己的拆分函数。关于S.O.的例子有很多 要使用集合,请尝试以下操作:
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;12;13;'
Declare @c VARCHAR(100)
While len(@a) > 1
Begin
Set @c = substring(@a,1,charindex(';',@a,2))
Set @b += @c Where @c Not In @b ----This statement gives a problem and shows a syntax error
Set @a = substring(@a,charindex(';',@a,2),len(@a))
Select @a, @b, @c
End
这将产生
DECLARE @a TABLE (id INT identity(1, 1), val INT)
DECLARE @b TABLE (Val INT)
DECLARE @c INT
DECLARE @aSetStr VARCHAR(max)
DECLARE @bSetStr VARCHAR(max)
INSERT INTO @a
VALUES (2), (9), (12), (13), (14), (16), (17), (21)
INSERT INTO @b
VALUES (2), (12), (13)
DECLARE @i INT = 0
WHILE EXISTS (
SELECT A.id
FROM @a A
LEFT JOIN @b B
ON A.Val = B.Val
WHERE A.id > @i AND B.Val IS NULL
)
BEGIN
SELECT TOP 1 @i = A.id, @c = A.Val
FROM @a A
LEFT JOIN @b B
ON A.Val = B.Val
WHERE A.id > @i AND B.Val IS NULL
ORDER BY A.id ASC
IF NOT EXISTS (
SELECT 1
FROM @b B
WHERE B.Val = @c
)
INSERT INTO @b (Val)
SELECT @c
SELECT @aSetStr = STUFF((
SELECT ';' + CAST(val AS VARCHAR(max))
FROM @a
FOR XML PATH('')
), 1, 0, '') + ';'
SELECT @bSetStr = STUFF((
SELECT ';' + CAST(val AS VARCHAR(max))
FROM @b
FOR XML PATH('')
), 1, 0, '') + ';'
SELECT @aSetStr AS [Set A], @bSetStr AS [Set B], cast(@C AS VARCHAR(255)) AS [Value of C]
END
如果我正确理解您的问题,我相信您会希望使用集合表而不是字符串。如果绝对必要,可以使用SQL Server 2016中存在的拆分函数使用字符串执行此操作,但必须为以前的版本编写自己的拆分函数。关于S.O.的例子有很多 要使用集合,请尝试以下操作:
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;12;13;'
Declare @c VARCHAR(100)
While len(@a) > 1
Begin
Set @c = substring(@a,1,charindex(';',@a,2))
Set @b += @c Where @c Not In @b ----This statement gives a problem and shows a syntax error
Set @a = substring(@a,charindex(';',@a,2),len(@a))
Select @a, @b, @c
End
这将产生
DECLARE @a TABLE (id INT identity(1, 1), val INT)
DECLARE @b TABLE (Val INT)
DECLARE @c INT
DECLARE @aSetStr VARCHAR(max)
DECLARE @bSetStr VARCHAR(max)
INSERT INTO @a
VALUES (2), (9), (12), (13), (14), (16), (17), (21)
INSERT INTO @b
VALUES (2), (12), (13)
DECLARE @i INT = 0
WHILE EXISTS (
SELECT A.id
FROM @a A
LEFT JOIN @b B
ON A.Val = B.Val
WHERE A.id > @i AND B.Val IS NULL
)
BEGIN
SELECT TOP 1 @i = A.id, @c = A.Val
FROM @a A
LEFT JOIN @b B
ON A.Val = B.Val
WHERE A.id > @i AND B.Val IS NULL
ORDER BY A.id ASC
IF NOT EXISTS (
SELECT 1
FROM @b B
WHERE B.Val = @c
)
INSERT INTO @b (Val)
SELECT @c
SELECT @aSetStr = STUFF((
SELECT ';' + CAST(val AS VARCHAR(max))
FROM @a
FOR XML PATH('')
), 1, 0, '') + ';'
SELECT @bSetStr = STUFF((
SELECT ';' + CAST(val AS VARCHAR(max))
FROM @b
FOR XML PATH('')
), 1, 0, '') + ';'
SELECT @aSetStr AS [Set A], @bSetStr AS [Set B], cast(@C AS VARCHAR(255)) AS [Value of C]
END
获得预期结果的另一种方法
TRY THIS CODE
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;12;13;'
Declare @c VARCHAR(100)
While len(@a) > 1
Begin
Set @c = substring(@a,1,charindex(';',@a,2))
IF (@c) NOT IN (@b) begin
Set @b += @c
end
Set @a = substring(@a,charindex(';',@a,2),len(@a))
Select @a, @b, replace(@c,';','')
End
获得预期结果的另一种方法
TRY THIS CODE
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;12;13;'
Declare @c VARCHAR(100)
While len(@a) > 1
Begin
Set @c = substring(@a,1,charindex(';',@a,2))
IF (@c) NOT IN (@b) begin
Set @b += @c
end
Set @a = substring(@a,charindex(';',@a,2),len(@a))
Select @a, @b, replace(@c,';','')
End
如果值是唯一的,则可以使用UNION合并字符串:
ExpectedCResult
---------------------------------
'; 2; 9; 12; 13; 14; 16; 17; 21 ;'
如果值是唯一的,则可以使用UNION合并字符串:
ExpectedCResult
---------------------------------
'; 2; 9; 12; 13; 14; 16; 17; 21 ;'
要直接解决您的问题,请更改:
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;7;12;13;'
Declare @c VARCHAR(100)
;WITH
a AS
(
SELECT @a AS FIELD, SUBSTRING(@a, 1, CHARINDEX(';', @a)) AS num
UNION ALL
SELECT RIGHT(FIELD, LEN(FIELD)-LEN(num)), SUBSTRING(RIGHT(FIELD, LEN(FIELD)-LEN(num)), 1, CHARINDEX(';', RIGHT(FIELD, LEN(FIELD)-LEN(num))))
FROM a
WHERE FIELD != num
),
b AS
(
SELECT @b AS FIELD, SUBSTRING(@b, 1, CHARINDEX(';', @b)) AS num
UNION ALL
SELECT RIGHT(FIELD, LEN(FIELD)-LEN(num)), SUBSTRING(RIGHT(FIELD, LEN(FIELD)-LEN(num)), 1, CHARINDEX(';', RIGHT(FIELD, LEN(FIELD)-LEN(num))))
FROM b
WHERE FIELD != num
)
SELECT @c =
(
SELECT ';' + CAST(v.num AS VARCHAR)
FROM (
SELECT CAST(REPLACE(a.num, ';', '') AS INT) num
FROM a
WHERE a.num != ';'
UNION
SELECT CAST(REPLACE(b.num, ';', '') AS INT)
FROM b
WHERE b.num != ';'
) v
FOR XML PATH('')
) + ';'
SELECT @c
致:
要直接解决您的问题,请更改:
Declare @a VARCHAR(100) = ';2;9;12;13;14;16;17;21;'
Declare @b VARCHAR(100) = ';2;7;12;13;'
Declare @c VARCHAR(100)
;WITH
a AS
(
SELECT @a AS FIELD, SUBSTRING(@a, 1, CHARINDEX(';', @a)) AS num
UNION ALL
SELECT RIGHT(FIELD, LEN(FIELD)-LEN(num)), SUBSTRING(RIGHT(FIELD, LEN(FIELD)-LEN(num)), 1, CHARINDEX(';', RIGHT(FIELD, LEN(FIELD)-LEN(num))))
FROM a
WHERE FIELD != num
),
b AS
(
SELECT @b AS FIELD, SUBSTRING(@b, 1, CHARINDEX(';', @b)) AS num
UNION ALL
SELECT RIGHT(FIELD, LEN(FIELD)-LEN(num)), SUBSTRING(RIGHT(FIELD, LEN(FIELD)-LEN(num)), 1, CHARINDEX(';', RIGHT(FIELD, LEN(FIELD)-LEN(num))))
FROM b
WHERE FIELD != num
)
SELECT @c =
(
SELECT ';' + CAST(v.num AS VARCHAR)
FROM (
SELECT CAST(REPLACE(a.num, ';', '') AS INT) num
FROM a
WHERE a.num != ';'
UNION
SELECT CAST(REPLACE(b.num, ';', '') AS INT)
FROM b
WHERE b.num != ';'
) v
FOR XML PATH('')
) + ';'
SELECT @c
致:
谢谢@Jay的回答。我使用的代码实际上是有效的。值比较语句有一个问题:设置b+=c,其中c不在b中。以及自使用SQL Server 2012以来已创建的拆分函数。因此,在我当前的代码中,只有B的值没有得到更新,除了我得到A的结果,CIt不允许我在变量之前使用@符号,因为它们不是用户名称,所以实际上。。。。。。你的代码不工作了?我建议你阅读这个答案并学习一些东西。这是你的问题:设置@b+=@c,其中@c不在@b中。。。这需要更改为选择@B+=@c+';'如果不存在,请从中选择1fnSplit@b,';' x其中x.SplitItemValue=@cThanks@JayWheeler,但我没有用于拆分的特定函数,我在这里使用while循环进行回归拆分谢谢@Jay的回答。我使用的代码实际上是有效的。值比较语句有一个问题:设置b+=c,其中c不在b中。以及自使用SQL Server 2012以来已创建的拆分函数。因此,在我当前的代码中,只有B的值没有得到更新,除了我得到A的结果,CIt不允许我在变量之前使用@符号,因为它们不是用户名称,所以实际上。。。。。。你的代码不工作了?我建议你阅读这个答案并学习一些东西。这是你的问题:设置@b+=@c,其中@c不在@b中。。。这需要更改为选择@B+=@c+';'如果不存在,请从中选择1fnSplit@b,';' x其中x.SplitItemValue=@cThanks@JayWheeler,但我没有用于拆分的特定函数,我在这里使用while循环进行回归拆分谢谢你的回答。我尝试了很多次,它实际上并没有运行IF语句,只是简单地将c的值连接到bThanks以获得答案。我试了很多次,它实际上并没有运行IF语句,只是简单地将c的值连接到bThanks@DenisRubashkin的answerThank@DenisRubashkin的answer抱歉,我想我得到的case语句是错误的,请尝试更新的答案。这很有效。谢谢。我现在只需要一种方法来修剪额外的分号:Set@b+=CASE WHENCHARINDEX@c,@b>0,然后是其他substring@c2.len@c没有问题,很好,很高兴能帮上忙。啊,对不起,我想我把案例陈述搞错了,试试更新后的答案。这很有效。谢谢。我现在只需要一种方法来修剪额外的分号:Set@b+=CASE WHENCHARINDEX@c,@b>0,然后是其他substring@c2.len@c没问题,很好,很高兴它有帮助