有表: mytable(i int,c char(50))
查询:select * from mytable where i IN(1,3,5,2,4,6)
希望其结果集的顺序也是按i,1,3,5,2,4,6排列,
是否有SQL查询语句可以直接搞定?

解决方案 »

  1.   


    select row_number() over(partition by getdate() order by getdate()) aid,* 
    from tb where id in (2,4,3,5) order by aid--SQL 2005的写法。
      

  2.   


    CREATE TABLE #temp(i int NOT NULL UNIQUE, seq int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED)
    INSERT INTO #temp
    SELECT 1 UNION ALL
    SELECT 3 UNION ALL
    SELECT 5 UNION ALL
    SELECT 2 UNION ALL
    SELECT 4 UNION ALL
    SELECT 6
    SELECT tb.*
    FROM mytable tb
    INNER JOIN #temp tmp
    ON tb.i = tmp.i
    ORDER BY tmp.seq
      

  3.   

    希望的伪代码为:
    select * from mytable where i IN(1,3,4,5,2,6) order by i{1,3,4,5,2,6}
      

  4.   

    这样更简洁:SELECT tb.*
    FROM dbo.Nums tb
    INNER JOIN dbo.Split('1,3,5,2,4,6',',') l
    ON tb.n = l.v
    ORDER BY l.i
    前提是需要先定义一个表值函数:CREATE FUNCTION dbo.Split(
    @string nvarchar(max),
    @separator nvarchar(10) = N','
    )
    RETURNS TABLE
    RETURN
    SELECT
    i = ROW_NUMBER() OVER(ORDER BY (SELECT 1)),
    v = x.n.value('.','nvarchar(50)')
    FROM (
    SELECT ValuesXML = CAST('<root>' +
    REPLACE((SELECT v = @string FOR XML PATH('')),@separator,'</v><v>') +
    '</root>' AS XML)
    ) t
    CROSS APPLY t.ValuesXML.nodes('/root/v') x(n)
      

  5.   

    这也是我目前想到的最有效的办法,增加一个排序列,只是脚本太难看臃肿,因为实际select的字段是很多的
      

  6.   

    这也是我目前想到的最有效的办法,增加一个排序列,只是脚本太难看臃肿,因为实际select的字段是很多的