2010-06-04 59 views
2

我有一个带有作业#和后缀的表格。我试图创建的查询选择一系列作业#/后缀条目,其中后缀依赖于作业#。例如:选择两个字段的范围

Job #    Suffix 
--------   ----------- 
00000001   001 
00000001   002 
00000001   003 
00000002   001 
00000002   002 
00000002   003 
00000002   004 
00000003   001 
00000003   002 
00000003   003 
00000003   004 

我有四个输入。一对是起始作业/后缀,然后是结束作业/后缀。如果用户输入:

开始:00000001/002

结束:00000002/002

他们会得到如下结果:

Job #    Suffix 
--------   ----------- 
00000001   002 
00000001   003 
00000002   001 
00000002   002 

我想知道如果有一个简单在存储过程中的一个select语句中执行此操作的方法。我认为迄今为止做的唯一方法是首先将作业选择到表变量中,然后用另一个查询过滤后缀。

这看起来很简单,但是难以将我的大脑包裹在这一个中。

谢谢!

+0

我很困惑为什么后缀'003'会显示结尾后缀是'002' – 2010-06-04 15:39:19

+0

将后缀看作是作业#的扩展名。后缀完全取决于作业,所以00000001/003将在范围内,因为它遵循低范围00000001/002。几乎将这两个字段想成一个序列号。 – VinPepe 2010-06-04 15:45:11

回答

1

我不能完全确定你想要做什么,但一个快速的猜测是这样的..

SELECT * FROM tbl 
WHERE (job + suffix*0.001) 
BETWEEN (starting_job + suffix*0.001) AND (ending_job + suffix*0.001) 

这工作,因为它好像后缀是次要编号。基本上,你正在序列化为“job.suffix”,并选择你在这个集合的范围之间的位置。如果可以,请在(start_job + suffix*0.001)上创建索引。这还假定后缀是numeric(3)

+0

或者,您可以将第一个乘以一千,然后添加第二个。这可能会更快,因为您将避免需要浮点比较。 – 2010-06-04 15:55:05

+2

这将适用于碰巧是数字的值,并且不会溢出。但是对于更一般的情况,您需要将其作为字符串来完成。 – 2010-06-04 16:04:38

+0

是的,我假设没有这些溢出,或者是非数字的。 – 2010-06-04 16:10:44

1

你应该能够只是从你的2个查询组合的where子句为1

喜欢的东西

SELECT ... 
WHERE 
    JOB# BETWEEN '00000001' and '00000002' 
AND Suffix BETWEEN '001' and '002' 

编辑: 您的更新后,我会做

SELECT ... 
WHERE 
    JOB# + Suffix BETWEEN '00000001002'+ and '00000002002' 

我假设值与前导0

+0

这不起作用,看到我的问题上面的'003'部分上作业'00000001'应该返回'00000001/002','00000002/002' – 2010-06-04 15:48:26

+0

是的,我看到了更新。在问题更新之后,您击败了我的更新...我认为追加字符串是最简单的方法。你可以在+ – Cobusve 2010-06-04 15:52:15

1

我认为你需要在where子句中做一些计算。

SELECT Table1.JOB, Table1.SUF 
FROM Table1 
WHERE (((Table1.JOB)>="00001" And (Table1.JOB)<="00002") AND (([JOB] & [SUF])>="00001002" And ([JOB] & [SUF])<="00002002")); 
6

在这里你去:

DECLARE @t TABLE (jobnum varchar(10), suffix varchar(3)) 

INSERT INTO @t (jobnum, suffix) VALUES ('00000001', '001') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000001', '002') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000001', '003') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000002', '001') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000002', '002') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000002', '003') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000002', '004') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000003', '001') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000003', '002') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000003', '003') 
INSERT INTO @t (jobnum, suffix) VALUES ('00000003', '004') 

DECLARE @Startjob VARCHAR(10) 
DECLARE @Startsuf VARCHAR(3) 
DECLARE @Endjob VARCHAR(10) 
DECLARE @Endsuf VARCHAR(3) 
SET @Startjob='00000001' 
SET @Startsuf='002' 
SET @Endjob='00000002' 
SET @Endsuf='002' 

;WITH raw AS 
(
SELECT jobnum, suffix, ind=RIGHT('0000000000'+ISNULL(jobnum,''),10)+RIGHT('000'+ISNULL(suffix,''),3) 
    FROM @t 
) 
SELECT * 
    FROM raw 
    WHERE ind BETWEEN 
     RIGHT('0000000000'+ISNULL(@Startjob,''),10)+RIGHT('000'+ISNULL(@Startsuf,''),3) 
     AND 
     RIGHT('0000000000'+ISNULL(@Endjob,''),10)+RIGHT('000'+ISNULL(@Endsuf,''),3) 

有为了处理短长度和空值是一堆多余的字符串操作在里面。

+0

之前将输入与+一起附加,如果你愿意,或者只是将它们合并,你可以使用'(coalesce(job_range * 1000,0)+ coalesce(suffix,0))修改我的处理空值' – 2010-06-04 16:07:35