2012-01-04 59 views
3

我一直在嘗試一段時間以下列順序用ID(int)值從數據庫返回數據。SQL查詢以設定的順序返回值

3,6,1,9,2,5

反正有這可以做什麼?

編輯:好吧,我在我的文章中做了一些東西。上面的ID就是一個例子。

我想動態地做到這一點,基於從另一個表有多少記錄鏈接到我想要拔出的記錄,例如,我主辦了3個分支機構,每個分支機構都有一組商店,我如何確定哪個分支機構最多?

我希望這會有所幫助。

+1

您應該在您的應用程序中訂購它們。這是一個任意的序列... – 2012-01-04 14:35:10

+1

正如你看到下面,是的,你可以。問題應該是我應該這樣做嗎?答案將是一個強調的否。你試圖做的解決方案非常脆弱。 – Bueller 2012-01-04 14:38:59

+0

好吧,大家好,謝謝你的建議,雖然他們沒有解決我的問題,但他們確實指出了我的正確方向。 – Reaper 2012-01-05 13:27:02

回答

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

的排序創建一個表。

CREATE TABLE SortPriority( 的SourceID INT NULL, 優先INT NULL)

與IDS填充它,他們應該在showup什麼樣的順序,加入到表中。並在排序中使用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