首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用逗号分隔两个逗号分隔的值,并存储在同一临时表的两列中。

问用逗号分隔两个逗号分隔的值,并存储在同一临时表的两列中。
EN

Stack Overflow用户
提问于 2015-03-02 08:00:10
回答 2查看 885关注 0票数 1

同样,在编写SQL查询时,我需要您的帮助。

我有两个逗号分隔的字符串:

代码语言:javascript
复制
1,2,3     and      a,b,c

两个逗号分隔值中的元素数(例如1、2和3)是相同的。在给定的例子中,它的3。

我想要的是用逗号分隔值,并将它们存储在同一临时表的两列中。

​

​

我正在使用Server 2012。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-02 08:25:54

我已经想出了解决办法。但我想把它贴出来,这样可以对其他人有帮助,或者你可以指导我使它更有效-

代码语言:javascript
复制
DECLARE @xml1 xml
DECLARE @xml2 xml
DECLARE @str1 VARCHAR(MAX)
DECLARE @str2 VARCHAR(MAX)
DECLARE @delimiter CHAR(1)
DECLARE @TmpTbl1 TABLE (Id INT IDENTITY(1,1), Col1 VARCHAR(50))
DECLARE @TmpTbl2 TABLE (Id INT IDENTITY(1,1), Col2 VARCHAR(50))
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))

SET @str1 = '1,2,3'
SET @str2 = 'a,b,c'
SET @delimiter = ','

SET @xml1 = CAST(('<X>'+replace(@str1, @delimiter, '</X><X>')+'</X>') AS XML)
SET @xml2 = CAST(('<X>'+replace(@str2, @delimiter, '</X><X>')+'</X>') AS XML)

INSERT INTO @TmpTbl1 (Col1)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml1.nodes('X') AS X(C)

INSERT INTO @TmpTbl2 (Col2)
SELECT C.value('.', 'VARCHAR(50)') AS value FROM @xml2.nodes('X') AS X(C)

INSERT INTO @TmpTbl3 (Col1, Col2)
SELECT tmp1.Col1, tmp2.Col2
FROM @TmpTbl1 tmp1
INNER JOIN @TmpTbl2 tmp2 ON tmp1.Id = tmp2.Id

SELECT Col1, Col2 FROM @TmpTbl3
票数 1
EN

Stack Overflow用户

发布于 2015-03-02 10:35:26

我建议您创建一个UDF,它接受分隔字符串输入,并返回一个ID表,如下所示(因此可以在需要时重用它):

代码语言:javascript
复制
Go
CREATE FUNCTION [dbo].[ReturnTableFromDelimetedStringWithID] (@list VARCHAR(MAX), @delimiter VARCHAR(30), @inclblanks BIT) 
    RETURNS @table TABLE (id INT NOT NULL PRIMARY KEY, item VARCHAR(3000) ) 
    AS 
    BEGIN 
        DECLARE @item    VARCHAR(3000) 
        DECLARE @delim      VARCHAR(30) 
        DECLARE @str        VARCHAR(MAX) 
        DECLARE @pos        INT 

        DECLARE @id        INT 

        SET @id = 0 
        SET @delim = @delimiter 
        IF @delim='' SET @delim=',' 

        SET @str = @list + @delim

        WHILE CHARINDEX (@delim, @str) > 0
        BEGIN

            SET @id = @id + 1 
            SET @pos = CHARINDEX (@delim, @str)
            SET @item = CONVERT(VARCHAR(3000), SUBSTRING( @str, 1, @pos - 1))
            SET @str = SUBSTRING( @str, @pos + LEN(@delim), LEN( @str))

            IF @inclblanks=1 
                INSERT INTO @table VALUES (@id, @item) 
            ELSE 
                IF @item<>'' INSERT INTO @table VALUES (@id, @item) 

        END 

        RETURN 
    END
GO

然后,您可以查询如下:

代码语言:javascript
复制
DECLARE @str1 VARCHAR(MAX) = '1,2,3'
DECLARE @str2 VARCHAR(MAX)= 'a,b,c'
DECLARE @delimiter CHAR(1) = ','
DECLARE @TmpTbl3 TABLE (Col1 VARCHAR(50), Col2 VARCHAR(50))

INSERT INTO @TmpTbl3
SELECT t1.c2, t2.c2
FROM 
(
    SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str1, ',', 0)
) as t1
INNER JOIN 
(
SELECT id [c1], item [c2] FROM dbo.ReturnTableFromDelimetedStringWithID(@str2, ',', 0)
) AS t2 ON t1.c1=t2.c1

--SELECT * FROM @TmpTbl3

这可能是最好的办法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28804996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档