Sql 选择此选项可从单行返回多行

Sql 选择此选项可从单行返回多行,sql,sql-server,select,Sql,Sql Server,Select,我正在处理一个查询,该查询返回如下所示的项目列表: SELECT ID, Description FROM TableA WHERE ID = 10001 返回: ID Description 10001 Item1 Item2 Item3 Item4 但是,我想要的是能够返回多行 ID Description 10001 Item1 10001 Item2 10001 Item3 10001 Item4 有没有一个简单的方法来实现这一点 谢谢大家! 以下是

我正在处理一个查询,该查询返回如下所示的项目列表:

SELECT ID, Description FROM TableA WHERE ID = 10001
返回:

ID     Description
10001  Item1 Item2 Item3 Item4
但是,我想要的是能够返回多行

ID     Description
10001  Item1 
10001  Item2 
10001  Item3 
10001  Item4
有没有一个简单的方法来实现这一点


谢谢大家!

以下是如何做到这一点:

SELECT id,
   Split.a.value('.', 'VARCHAR(100)') AS String  
FROM  (SELECT id, CAST ('<M>' + REPLACE(description, ' ', '</M><M>') + '</M>' AS XML) AS n from TableA where id = 1001) AS A 
CROSS APPLY n.nodes ('/M') AS Split(a); 

Fiddle

以下是您可以做到这一点的方法:

SELECT id,
   Split.a.value('.', 'VARCHAR(100)') AS String  
FROM  (SELECT id, CAST ('<M>' + REPLACE(description, ' ', '</M><M>') + '</M>' AS XML) AS n from TableA where id = 1001) AS A 
CROSS APPLY n.nodes ('/M') AS Split(a); 

Fiddle

您也可以创建一个函数来实现这一点

CREATE FUNCTION [dbo].[RowToManyRows] ( @StringInput VARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] VARCHAR(10) )
AS
BEGIN

    DECLARE @String    VARCHAR(10)

    WHILE LEN(@StringInput) > 0
    BEGIN
        SET @String      = LEFT(@StringInput, 
                                ISNULL(NULLIF(CHARINDEX(' ', @StringInput) - 1, -1),
                                LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(CHARINDEX(' ', @StringInput), 0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

        INSERT INTO @OutputTable ( [String] )
        VALUES ( @String )
    END

    RETURN
END
GO
然后查询该函数

SELECT ID, String
FROM myTable CROSS APPLY [dbo].RowToManyRows(myTable.Description)
例如:

CREATE TABLE myTable 
( ID INT, 
   Description VARCHAR(50)
 )

 INSERT INTO dbo.myTable
         ( ID, Description )
 VALUES  ( 1, -- ID - int
           'A B'  -- Description - varchar(50)
         ),
         (2, 
         'C D')
结果

1   A
1   B
2   C
2   D

您还可以创建一个函数来实现这一点

CREATE FUNCTION [dbo].[RowToManyRows] ( @StringInput VARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] VARCHAR(10) )
AS
BEGIN

    DECLARE @String    VARCHAR(10)

    WHILE LEN(@StringInput) > 0
    BEGIN
        SET @String      = LEFT(@StringInput, 
                                ISNULL(NULLIF(CHARINDEX(' ', @StringInput) - 1, -1),
                                LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(CHARINDEX(' ', @StringInput), 0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

        INSERT INTO @OutputTable ( [String] )
        VALUES ( @String )
    END

    RETURN
END
GO
然后查询该函数

SELECT ID, String
FROM myTable CROSS APPLY [dbo].RowToManyRows(myTable.Description)
例如:

CREATE TABLE myTable 
( ID INT, 
   Description VARCHAR(50)
 )

 INSERT INTO dbo.myTable
         ( ID, Description )
 VALUES  ( 1, -- ID - int
           'A B'  -- Description - varchar(50)
         ),
         (2, 
         'C D')
结果

1   A
1   B
2   C
2   D

这对我来说毫无意义!您的数据是如何存储的?您是否有ID=10001的4个不同记录?如果是,那么这个选择应该返回4行。它不会将它们合并到1中。如果你找到了任何方法,不管是简单的还是困难的,我建议使用这种方法来明确地分割数据并将其存储在多行上,项目有一个主记录和多个详细记录。我建议使用一个空格作为分隔符来分割它们。最好的方法是规范化您的表和关系。有些人已经为您提供了技术解决方案,但正如上面的一些评论所说的,您做得不对!错误使用数据库在列描述中存储多个值项。数据库的全部目的是使您的数据可访问。如果您只需要id,那么item=ABC所在的位置会怎么样?您将再次需要复杂的处理。请重新考虑您的设计,并将数据存储在您的what I want中,重复ID,每行一项。这对我来说毫无意义!您的数据是如何存储的?您是否有ID=10001的4个不同记录?如果是,那么这个选择应该返回4行。它不会将它们合并到1中。如果你找到了任何方法,不管是简单的还是困难的,我建议使用这种方法来明确地分割数据并将其存储在多行上,项目有一个主记录和多个详细记录。我建议使用一个空格作为分隔符来分割它们。最好的方法是规范化您的表和关系。有些人已经为您提供了技术解决方案,但正如上面的一些评论所说的,您做得不对!错误使用数据库在列描述中存储多个值项。数据库的全部目的是使您的数据可访问。如果您只需要id,那么item=ABC所在的位置会怎么样?您将再次需要复杂的处理。请重新考虑您的设计,并将数据存储在您的what I want中,重复ID,每行一项。