SQL Query以set序列返回值

时间:2012-01-04 14:31:17

标签: sql

我已经尝试了一段时间,按照以下顺序使用ID(int)值从数据库返回数据。

3,6,1,9,2,5。

无论如何这可以做到吗?

编辑:好的,我在帖子中写了一些东西。上面的ID只是一个例子。

我正在尝试动态地执行此操作,这是基于另一个表中有多少记录链接到我想要提取的记录,例如我主持3个分支机构,每个分支机构都有一组商店,我如何确定哪个分支最多?

我希望这会有所帮助。

4 个答案:

答案 0 :(得分: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和其他数字按升序排列。

答案 1 :(得分: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

你明白了......

答案 2 :(得分:1)

创建一个排序表。

CREATE TABLE SortPriority(     SourceID int NULL,     优先级为NULL)

使用id填充它以及它们应该显示的顺序。加入表格。并在排序中使用SortPriority.Priority。

您可以更轻松地以这种方式更改排序。您只需要修改数据。您也可以稍后编写脚本来填充表,以便在更改排序时处理可预测的需求。

答案 3 :(得分: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