如何在T-sql中使用逗号分隔的1列值或sql语句中生成多行

时间:2011-09-26 02:00:56

标签: sql sql-server sql-server-2005 tsql sql-server-express

ColumnName  IsOrdered    Seq_ID
ABC          2              2
DEF          1              1
GHI          0             NULL
JKL          1              4
MNO          1              3
PQR          0              5

我在数据库中有一个表(table1),其中存储了以上值。

  

注意: -

予。 Is_Ordered列:2 - >说明; 1 - > ASC; 0 - >默认值。

II。 Seq_ID列:列名称按顺序排列

这些值由用户存储在上表中(即在用户界面上)。我想从多行生成一个'order by'子句到一个带有逗号','分隔(单个列)的语句。

例如:从表1中选择*由DEF asc,ABC desc,MNO asc,JKL asc

这里我想编写一个sql语句来生成如上所示的order by语句i.e. (order by DEF asc, ABC desc, MNO asc, JKL asc)

在这里,您会注意到GHI列和PQR列未包含在内,因为这两个列未按用户界面中的选择顺序选择。

我事先感谢你试图理解我的问题并为此提供了适当的解决方案。

2 个答案:

答案 0 :(得分:1)

希望这有帮助

DECLARE @OrderBySetting VARCHAR(max) = ''
DECLARE @OrderByString VARCHAR(max) = ''

DECLARE MY_CURSOR CURSOR
FOR  SELECT  ColumnName + ' ' + 
case IsOrdered  
    WHEN 1 THEN 'ASC'
    WHEN 2 THEN 'DESC'
    END
    + ','
FROM         Table1
WHERE     (IsOrdered <> 0)
ORDER BY Seq_ID DESC

OPEN My_Cursor 

Fetch NEXT FROM MY_Cursor INTO @OrderBySetting

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @OrderByString = @OrderBySetting + @OrderByString


FETCH NEXT FROM MY_Cursor INTO @OrderBySetting
END
CLOSE MY_Cursor
DEALLOCATE MY_Cursor

SET @OrderByString = 'SELECT * FROM TABLE1 ORDER BY ' + SUBSTRING(@OrderByString, 1, LEN(@OrderByString)-1)

答案 1 :(得分:1)

在这里(可能需要添加CAST)

SELECT
    'ORDER BY ' +
      SUBSTRING(
      (
      SELECT
          ',' + ColumnName + 
               CASE IsOrdered  
                 WHEN 1 THEN 'ASC'
                 WHEN 2 THEN 'DESC'
               END
      FROM
          MyTable
      WHERE
          IsOrdered > 0 -- why have "IsIncluded" column ?
      ORDER BY
          Seq_ID
      FOR XML PATH ('')
      )
      , 2, 7999)