选择从单行返回多行

时间:2015-05-26 21:23:40

标签: 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

有没有简单的方法来实现这一目标?

谢谢!

2 个答案:

答案 0 :(得分:4)

以下是如何执行此操作的方法:

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); 

小提琴http://sqlfiddle.com/#!3/152e3/1

答案 1 :(得分:1)

你也可以创建一个这样做的功能

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