2012-01-04 9 views
3

私はしばらくの間、次の順序でID(int)値を持つデータベースからデータを返そうとしています。SQL照会の戻り値のセットシーケンス

3、6、1、9、2、5

これを行うことができますとにかくありますか?

編集:私は私のポストでちょっとしたものを作った。上記のIDは単なる例に過ぎません。

私は、取り出したいレコードに他のテーブルからいくつのレコードがリンクされているかに基づいて、これを動的に実行しようとしています。私は3つの支店をホストし、各支店にはどのグループがどのような支店をもっているのかを判断するにはどうすればいいですか?

こちらがお役に立てば幸いです。

+1

アプリケーションでそれらを注文する必要があります。それは任意のシーケンスです... –

+1

以下に見られるように、そうすることができます。質問は私がこれをしなければならないのですか?その答えは重要なNOになります。あなたがしようとしていることに対する解決策は非常に脆弱です。 – Bueller

+0

皆さん、アドバイスをいただきありがとうございましたが、私の問題を解決した人はいませんでしたが、正しい方向に私を指摘しました。 – Reaper

答えて

4

はい、このような何か:

select ID from tablename 
order by 
    CASE WHEN ID = 3 THEN 1 
     WHEN ID = 6 THEN 2 
     WHEN ID = 1 THEN 3 
     WHEN ID = 9 THEN 4 
     WHEN ID = 2 THEN 5 
     WHEN ID = 5 THEN 6 
     ELSE 7 END, ID ASC 

これは3,6,1,9,2,5を入れて、昇順に他の番号あとがきます。あなたのアイデアを得る

2
select cols from table where 
order by 
    case ID when 3 then 0 
    when 6 then 1 
    when 1 then 2 
    when 9 then 3 
    ... 
    end 

...

1

は、ソート用のテーブルを作成します。

IDとどのような順序で、彼らは見せつける必要があるとそれを移入します。テーブルに参加TABLE SortPriority( ソースIDのint型のNULL、 優先INT NULL)

を作成します。 sortPriority.Priorityをソートに使用します。

このように並べ替えを変更する方が簡単です。データを変更するだけで済みます。後でソートを変更する際の予測可能なニーズに対応するために、テーブルにデータを入れるスクリプトを書き込むこともできます。このような

0

分割機能:

CREATE FUNCTION fnSplit(@str varchar(max), @dlm char(1)) 
RETURNS @result TABLE (id int, value varchar(50)) 
AS BEGIN 
    DECLARE 
    @id int, @value varchar(50), 
    @lastpos int, @pos int, @len int; 
    SET @id = 0; 
    SET @len = LEN(@str); 
    SET @lastpos = 1; 
    SET @pos = CHARINDEX(@dlm, @str + @dlm); 
    IF @pos <> 0 
    WHILE 1 = 1 BEGIN 
     SET @value = SUBSTRING(@str, @lastpos, @pos - @lastpos); 
     IF @value <> '' BEGIN 
     SET @id = @id + 1; 
     INSERT INTO @result VALUES (@id, @value); 
     END; 
     IF @pos > @len BREAK; 
     SET @lastpos = @pos + 1; 
     SET @pos = CHARINDEX(@dlm, @str + @dlm, @lastpos); 
    END; 
    RETURN; 
END 

は、リスト内の値だけでなく、それらのインデックスだけでなく、を含む行セットを返すことになります。次に、この方法で関数を使用することができます。

SELECT 
… 
FROM atable t 
    LEFT JOIN dbo.Split('3,6,1,9,2,5', ',') s ON t.Value = s.Value 
ORDER BY 
    CASE WHEN s.id IS NULL THEN 2147483647 ELSE s.id END