Sql server T-SQL:有没有办法检查一个变量的值是否存在于另一个变量中

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;' 请帮忙。谢谢。如果我正确理解您的问题,我相信您会希望使用集合表而不是字符串。如果绝对必要,

代码:

我在这里试图完成的是,我声明了两个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没问题,很好,很高兴它有帮助