按where子句值的顺序检索行

时间:2014-04-17 06:53:19

标签: sql database derby

检索行的顺序有问题。我有一个名为documentfiles的表,我有三列文件名文件路径num我有一个查询,它检索相对于num的文件名和文件路径 这是我的查询

rs=s.executeQuery("SELECT filename from
                          documentfiles
                          where num  in
                                 (2167, 2156, 
                                  1677, 2149,
                                  1946,1511
                                 ) "
                  );

我面临的问题是查询以按此顺序检索的num的升序检索行

  

1511 1677 1946 2149 2151 2156 2167 2526 2527 2612 2887 2890 2894 2895 3665 6254 6258 6920 7001 7013 7071 7072 7074 7100

但我想按此顺序

  

2167, 2156, 1677, 7074, 2149, 7100, 7072, 2890, 2527, 2526, 1946, 1511, 7071, 7013, 7001, 6920, 6258, 6254, 3665, 2895, 2894, 2887, 2612, 2151

我已经按升序存储了num值  1511 1677 1946 2149 2151 2156 2167 2526 2527 2612 2887 2890 2894 2895 3665 6254 6258 6920 7001 7013 7071 7072 7074 7100 不按此顺序

  

2167,2156,1677,2149,1946,1511

所以我如何实现这一目标是可能的,

任何帮助将不胜感激

提前致谢

3 个答案:

答案 0 :(得分:2)

将查询调整为:

SELECT filename 
from documentfiles 
where num in (2167, 2156, 1677,2149,1946,1511)
order by case when num = 2167 then 1
              when num = 2156 then 2
              when num = 1677 then 3
              when num = 2149 then 4
              when num = 1946 then 5
              when num = 1511 then 6
         end

如果是生成的脚本,则不必关心放置的数量,因为构建查询会非常简单。如果没有生成,则必须手动放置。

我也可能建议你制作一个sp,并用带有2列(num,crt)的TVP(表值参数)调用它。所以你的查询会改变如下:

SELECT filename 
from documentfiles df
join tvp 
  on df.num=tvp.num
order by crt

答案 1 :(得分:2)

您没有说明您的DBMS,因此这是ANSI SQL:

with numbers (num, sort_order) as (
  values (2167,1), (2156,2), (1677,3), (2149,4), (1946,5), (1511, 6)
)
select filename 
from documentfiles d 
  join numbers n on d.num = n.num
order by n.sort_order

答案 2 :(得分:0)

CREATE TABLE numbers
(
    ID int identity(1,1) primary key,
    number int
)

CREATE PROCEDURE insertnumbers
@number int
AS BEGIN
    INSERT INTO numbers VALUES (@number);
END

现在你在开头

添加逗号
,2167, 2156, 1677, 7074, 2149, 7100,
7072, 2890, 2527, 2526, 1946, 1511,
7071, 7013, 7001, 6920, 6258, 6254,
3665, 2895, 2894, 2887, 2612, 2151

然后使用记事本和SEARCH AND REPLACE

搜索:, 替换:; EXEC insertnumbers

然后您先删除;,然后插入数字。然后INNER JOIN表文件名,表号为ON filename.filenumber = numbers.number和ORDER BY numbers.ID。