2012-01-04 57 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