0

row_number で変数 order by を使用しようとしています。各ケースに asc または desc なしで定義された単一の列がある場合に機能します。しかし、複数の列を定義したり、asc または desc を使用したりすると機能しません。

これは機能します:

select top(@perpage) *,row_number()
 over (order by
case @orderby when 'updated' then date_edited
              when 'oldest' then date_added  
  end
) 
as rid from
(select * from ads) a
 where rid>=@start and rid<@start+@perpage

しかし、私はこれをしたい:

select top(@perpage) *,row_number()
 over (order by
case @orderby when 'updated' then date_edited, user_type desc
              when 'oldest' then date_added, user_type desc
              when 'newest' then date_added desc, user_type desc
              when 'mostexpensive' then price desc, user_type desc
              when 'cheapest' then pricedesc, user_type desc
              when '' then user_type desc
  end
) 
as rid from
(select * from ads) a
 where rid>=@start and rid<@start+@perpage
4

3 に答える 3

1

代わりにこれを試してください:

select top(@perpage) *,row_number()
 over (order by
case @orderby when 'updated' then date_edited
              when 'oldest' then date_added
end,
case @orderby when 'newest' then date_added
end desc,
case @orderby when 'mostexpensive' then -price
              when 'cheapest' then pricedesc

end, 
  user_type desc
) 
as rid from ads a
where rid>=@start and rid<@start+@perpage
于 2013-09-30T09:41:22.230 に答える
1

これを試して

select top(@perpage) *,row_number()
 over (order by
case @orderby when 'updated' then date_edited end,
case @orderby when 'oldest' then date_added end,
case @orderby when 'newest' then date_added end desc,
case @orderby when 'mostexpensive' then price end desc,
case @orderby when 'cheapest' then price end,
user_type desc
) 
as rid from
(select * from ads) a
 where rid>=@start and rid<@start+@perpage
于 2013-09-30T09:43:20.710 に答える
0

CASE単一の値を返す式です。2番目の並べ替え列は常に同じであるため、次のようにすることができます:

 over (order by
case @orderby when 'updated' then date_edited
              when 'oldest' then date_added
              when 'newest' then date_added desc
              when 'mostexpensive' then price desc
              when 'cheapest' then pricedesc
  end, user_type desc
)

(@orderbyが と等しい''場合、 case 式はすべてのNULL行に対して生成されますが、すべてNULLの が一緒に並べ替えられるため、これで問題ありません)

すべての列名が互換性のある型を示唆しているわけではないことに気付きました - その場合、これはより良いかもしれません:

 over (order by
case @orderby when 'updated' then date_edited
              when 'oldest' then date_added
  end,
  case @orderby 
        when 'newest' then date_added
  end desc,
  case @orderby
        when 'mostexpensive' then price
  end desc,
  case @orderby
        when 'cheapest' then price
  end asc,
  user_type desc
)

CASE必要なデータ型と昇順/降順の組み合わせごとに個別のステートメントを作成できます。上記のように、それぞれのステートメントは、言及されていない値NULLに対して s を生成します。@orderby

于 2013-09-30T09:41:13.340 に答える