我一直在嘗試一段時間以下列順序用ID(int)值從數據庫返回數據。SQL查詢以設定的順序返回值
3,6,1,9,2,5
反正有這可以做什麼?
編輯:好吧,我在我的文章中做了一些東西。上面的ID就是一個例子。
我想動態地做到這一點,基於從另一個表有多少記錄鏈接到我想要拔出的記錄,例如,我主辦了3個分支機構,每個分支機構都有一組商店,我如何確定哪個分支機構最多?
我希望這會有所幫助。
我一直在嘗試一段時間以下列順序用ID(int)值從數據庫返回數據。SQL查詢以設定的順序返回值
3,6,1,9,2,5
反正有這可以做什麼?
編輯:好吧,我在我的文章中做了一些東西。上面的ID就是一個例子。
我想動態地做到這一點,基於從另一個表有多少記錄鏈接到我想要拔出的記錄,例如,我主辦了3個分支機構,每個分支機構都有一組商店,我如何確定哪個分支機構最多?
我希望這會有所幫助。
是的,是這樣的:
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和後記升序其他數字。
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
你的想法...
的排序創建一個表。
CREATE TABLE SortPriority( 的SourceID INT NULL, 優先INT NULL)
與IDS填充它,他們應該在showup什麼樣的順序,加入到表中。並在排序中使用SortPriority.Priority。
你可以更容易地改變這種方式的排序。你只需要修改數據。您也可以稍後編寫腳本來填充表格,以便在更改排序時處理可預測的需求。
的分割功能像這樣的:
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
您應該在您的應用程序中訂購它們。這是一個任意的序列... – 2012-01-04 14:35:10
正如你看到下面,是的,你可以。問題應該是我應該這樣做嗎?答案將是一個強調的否。你試圖做的解決方案非常脆弱。 – Bueller 2012-01-04 14:38:59
好吧,大家好,謝謝你的建議,雖然他們沒有解決我的問題,但他們確實指出了我的正確方向。 – Reaper 2012-01-05 13:27:02