如何在Order By子句中使用字符串值?

时间:2013-12-30 13:04:38

标签: sql sql-server

我在数据库中有一个由10列组成的表,每列的标题名称是

  

'Col'+列号

看起来像这样

id|Col1|Col2|Col3|Col4|Col5|Col6

我有一个SQL语句,它通过存储过程运行,将存储的列号作为参数

@ColumnNumber nvarchar(10)

我想做的就是按照将在参数中传递的列号排序结果,类似这样

Select   * from [Table] order by  ('Col' + @ColumnNumber)

但它不能与我合作

4 个答案:

答案 0 :(得分:3)

您需要创建动态SQL以使其像

一样工作
DECLARE @ColumnNumber nvarchar(10)
DECLARE @strSQL nvarchar(max)
SET @ColumnNumber = '1'

SET @strSQL = 'Select * from [Table] order by Col' + @ColumnNumber
EXEC(@strSQL)

更新: 如果你有XML类型的@List变量有多个id,那么你可以使用逗号分隔格式,如下面的

DECLARE @RecordIds nvarchar(max)
DECLARE @List XML = '<Records><id>1</id></Records><Records><id>2</id></Records>'

SELECT  @RecordIds = STUFF((SELECT ',' + RecordId.value('.','varchar(5)') 
                            FROM @List.nodes('Records/id') AS Test(RecordId)
                FOR XML PATH (''))
                , 1, 1, '')

然后您可以在查询中使用逗号分隔的字符串,如

SET @strSQL = 'Select * from [Table] where Id in ( ' + @RecordIds + ' ) order by Col' + @ColumnNumber

答案 1 :(得分:3)

试试这个 -

DECLARE @ColumnNumber INT
SET @ColumnNumber = 1

SELECT *
FROM [Table]
ORDER BY 
    CASE @ColumnNumber
        WHEN 1 THEN Col1
        WHEN 2 THEN Col2
        WHEN 3 THEN Col3
    END

答案 2 :(得分:3)

不使用动态SQL,您可以使用CASE语句执行此操作:

SELECT * FROM [Table]
        ORDER BY CASE @ColumnNumber
           WHEN 1 THEN Col1
           WHEN 2 THEN Col2
           WHEN 3 THEN Col3
           .....
           WHEN 10 THEN Col10
         END;  

答案 3 :(得分:0)

试试这个 -

DECLARE @ColumnNumber NVARCHAR(10)
DECLARE @sql NVARCHAR(100)

SET @ColumnNumber = '1'
SET @sql = 'Select * from TEST_EXISTS order by COL' + @ColumnNumber + ' DESC'

PRINT @sql

EXEC (@SQL)