简体   繁体   English

选择从单行返回多行

[英]Select to Return Multiple Rows from Single Row

I am working on a query that returns a list of items shown below: 我正在处理一个查询,该查询返回如下所示的项目列表:

SELECT ID, Description FROM TableA WHERE ID = 10001

Returns: 返回值:

ID     Description
10001  Item1 Item2 Item3 Item4

However, what I want is to be able to make the return multiple rows. 但是,我想要的是能够使返回多行。

ID     Description
10001  Item1 
10001  Item2 
10001  Item3 
10001  Item4

Is there an easy way to achieve this? 有没有简单的方法可以做到这一点?

Thank you! 谢谢!

Here is how you can do this: 这是您可以执行的操作:

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 http://sqlfiddle.com/#!3/152e3/1 小提琴http://sqlfiddle.com/#!3/152e3/1

You can also create a function to do that as such 您也可以这样创建一个函数

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

You then query that function as such 然后,您可以查询该函数

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

Example: 例:

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

Results 结果

1   A
1   B
2   C
2   D

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM