我一直在尝试一段时间以下列顺序用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