sql文で指定したidシーケンスでソート
1197 ワード
古いウェブサイトは傷つけられないで、データベースは膨大で死にそうで、まだ勝手にデータベースの構造を変えることができなくて、いかなる補助フィールドがない情況の下で、管理者の与えたidのシーケンスによって並べ替える必要があって、本当に面倒です.の
仕方なく、sql関数を研究しましょう...
通常、私たちがデータを取得するのは一般的にこのような命令です.
このtbテーブルにはソートに関するフィールドがなく、オペレータが与えたidシーケンスに従って表示したいと考えています.シーケンス内にはなく、既存のソート方法に従って表示します.
では、まずidシーケンスに従ってソートする方法を見てみましょう.まず、このIDシーケンスは文字列です.sqlをつなぎ合わせて、次のコマンドを得ます.
このとき,inにつなぎ合わせることができる以上,文字列関数を用いて,現在のIDのIDシーケンス内の位置を得ることもできると考えられる.
このとき、IDシーケンスにない内容をリストしていないので、unionをつなぎ合わせなければなりません.
OK、これでID順に並べ替えた結果セットが得られました...
仕方なく、sql関数を研究しましょう...
通常、私たちがデータを取得するのは一般的にこのような命令です.
select * from tb order by id desc
このtbテーブルにはソートに関するフィールドがなく、オペレータが与えたidシーケンスに従って表示したいと考えています.シーケンス内にはなく、既存のソート方法に従って表示します.
では、まずidシーケンスに従ってソートする方法を見てみましょう.まず、このIDシーケンスは文字列です.sqlをつなぎ合わせて、次のコマンドを得ます.
select * from tb where id in (100,95,155,32,77,66)
このとき,inにつなぎ合わせることができる以上,文字列関数を用いて,現在のIDのIDシーケンス内の位置を得ることもできると考えられる.
select *,charindex(','+convert(nvarchar(10),id)+',','0,100,95,155,32,77,66,0') as sorted from tb where id in (100,95,155,32,77,66)
このとき、IDシーケンスにない内容をリストしていないので、unionをつなぎ合わせなければなりません.
select *,charindex(','+convert(nvarchar(10),id)+',','0,100,95,155,32,77,66,0') as sorted from tb where id in (100,95,155,32,77,66)
union
select *,len('0,100,95,155,32,77,66,0') as sorted from tb where id not in (100,95,155,32,77,66)
order by sorted,id desc
OK、これでID順に並べ替えた結果セットが得られました...