2010-06-04 6 views
2

J'ai une table avec un travail et un suffixe. La requête que j'essaie de créer sélectionne une plage d'entrées #/suffixes où le suffixe dépend du travail #. Par exemple:Sélection d'une plage avec deux champs

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

J'ai quatre entrées. Une paire est le travail/suffixe de départ, puis le travail/suffixe de fin. Si les entrées de l'utilisateur:

Démarrage: 00000001/002

Fin: 00000002/002

Ils obtiennent les résultats suivants:

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

Je veux savoir s'il y a simple façon de le faire dans une déclaration select dans mon proc stocké. La seule façon dont je pensais le faire jusqu'à présent serait de sélectionner les tâches d'abord dans une variable de table puis de filtrer le suffixe avec une autre requête.

Cela semble simple, mais ayant de la difficulté à envelopper mon cerveau autour de celui-ci.

Merci!

+0

Je suis confus pourquoi le suffixe '003' montrerait si le suffixe de fin était' 002' –

+0

pense au suffixe comme une extension du travail #. Le suffixe dépend entièrement du travail, 00000001/003 serait dans la plage car il suit 00000001/002 qui est la gamme basse. Presque penser aux deux champs comme un numéro de série. – VinPepe

Répondre

1

Je ne suis pas tout à fait sûr de ce que vous essayez de faire, mais une estimation rapide est quelque chose comme ça ..

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

Cela fonctionne, car il semble que le suffixe est le numéro mineur. Essentiellement, vous êtes en série à "job.suffix" et en sélectionnant où vous vous situez dans la plage de l'ensemble. Si vous le pouvez, créez un index sur (start_job + suffix*0.001). Cela suppose également le suffixe est de numeric(3)

+0

Vous pouvez également multiplier le premier par un millier et ajouter le second. Ce serait probablement plus rapide car vous éviterez la nécessité d'une comparaison à virgule flottante. –

+2

Cela fonctionnerait pour les valeurs qui sont numériques et ne débordent pas. Mais pour un cas plus général, vous devrez le faire en tant que chaînes. –

+0

Certes, je suppose qu'aucun de ces débordements, ou sont non numériques. –

1

Vous devriez pouvoir simplement combiner les clauses where de vos 2 requêtes en 1.

Quelque chose comme

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

EDIT: Après votre mise à jour je ferais

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

Je suppose des valeurs sont des chaînes avec le 0 de

+0

Cela ne fonctionnera pas, voir ma question ci-dessus une section '003' sur le travail' 00000001' devrait retourner entre '00000001/002',' 00000002/002' –

+0

Oui, j'ai vu la mise à jour. Vous avez battu ma mise à jour après la mise à jour de la question ... Je pense que l'ajout des chaînes en tant que telles sera le moyen le plus facile de le faire. Vous pouvez ajouter les entrées avec + si vous voulez ou simplement les combiner avant de passer à – Cobusve

1

Je pense que vous devez faire quelque chose avec un calcul dans la clause 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

Ici, vous allez:

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) 

Il y a un tas de manipulation de chaînes étrangères là-bas afin de traiter de courte longueur et les valeurs nulles.

+0

vous pouvez modifier le mien pour gérer les valeurs nulles en utilisant '(coalesce (job_range * 1000,0) + coalesce (suffixe, 0))' –

Questions connexes