选择具有两个字段的范围

时间:2010-06-04 15:33:50

标签: sql

我有一个带有作业#和后缀的表。我正在尝试创建的查询选择一系列作业#/后缀条目,其后缀取决于作业#。例如:

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语句中是否有一种简单的方法可以做到这一点。到目前为止,我认为这样做的唯一方法是首先将作业选择到表变量中,然后使用另一个查询过滤后缀。

这看起来很简单,但很难将我的大脑包裹在这个周围。

谢谢!

4 个答案:

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

为了处理短长度和空值,有一堆无关的字符串操作。

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

答案 2 :(得分: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的字符串

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