2010-11-15 4 views
2

Je dois sélectionner tous les nombres N (entiers) entre @min et @max Y a-t-il un moyen d'y parvenir sans utiliser de boucle quelconque?SELECT tout N entre @min et @max

Exemple: Disons @Min = 5, @max = 9

J'ai besoin les valeurs suivantes renvoyées par ma requête SQL: 5,6,7,8,9

(je suis en utilisant MSSQL 2005)

Merci !!

EDIT: Il s'agit d'une solution utilisant une fonction personnalisée, qui fonctionne correctement. Mais il semble trop d'effort pour parcourir tous les numéros manuellement. Donc, la question est encore, si c'est réalisable sans boucle.

CREATE FUNCTION GetAllNBetween 
( 
    @Min int, 
    @Max int 
) 
RETURNS @N TABLE(n int) 
AS 
BEGIN 
    WHILE @Min <= @Max 
    BEGIN 
     INSERT INTO @N VALUES(@Min) 
     SET @Min = @Min + 1 
    END 
    RETURN 
END 

A utiliser comme ceci:

SELECT * FROM GetAllNBetween(5, 9) 
+0

Pour clarifier: Je n'ai pas de table avec tous les N n'importe où. – Sam7

+0

pourquoi avez-vous besoin de faire cela en SQL? –

Répondre

2

La requête (comme suggéré par @Eric)

select ROW_NUMBER() OVER (ORDER BY so1.id) from sysobjects so1,sysobjects 

Renvoie les nombres compris entre 1 et ~ 3000, sur ma base de données de test presque vide . Vous pouvez ajouter un autre niveau de sysobjects pour obtenir un nombre démesuré de lignes.Ensuite, il est une simple question de filtrer cette

0

Essayez cette

declare @min int 

set @min= (select 5) 

declare @max int 

set @max=(select 9) 

select * from table 

where id between @min and @max 
+0

Eh bien le problème est qu'il n'y a pas de table qui existe avec les entrées. Donc, la table n'existe pas dans mon scénario. – Sam7

+0

où vos valeurs sont enregistrées? – anishMarokey

+0

Regardez ma réponse en utilisant la fonction. C'est ce que je veux dire. Excepté sans la fonction;) – Sam7

1

Vous pouvez le faire en utilisant le mot-clé entre. Voici l'exemple.

select * 
    from tableName 
where e_id between (SELECT min(e_id) FROM tableName a) 
       and (SELECT max(e_id) FROM tableName a) 

Et si vous connaissez min et max alors mettez directement ceux-ci à la place de la requête imbriquée. Pouvez-vous utiliser cette fonction row_number()?

+0

Eh bien le problème est qu'il n'y a pas de table qui existe avec les entrées. Donc, 'tableName' n'existe pas dans mon scénario. – Sam7

0

Ce qui est nouveau dans MSSQL 2005.

Aussi je viens de découvrir que vous pouvez aussi le faire en ms sql 2005:

select * 
    from dbo.GetTableOfSequentialIntegers(100) 
where number between 5 and 9 
2

Eh bien, je ne vois pas le point pourquoi vous ne voulez pas utiliser un loop, mais vous pouvez utiliser une récursivité à la place.

DECLARE @min INT 
DECLARE @max INT 

SET @min = 5; 
SET @max = 12; 

WITH Nbrs (n) AS (
    SELECT @min UNION ALL 
    SELECT 1 + n FROM Nbrs WHERE n < @max 
) 
SELECT n FROM Nbrs 
OPTION (MAXRECURSION 500) 

Il va générer une table avec toutes les valeurs. Génération d'une liste de chaînes de cela ne devrait pas être trop difficile;)

0

Je n'ai pas vu aucune réponse avec CTE (Common Table Expression), alors en voici une:

WITH RECURSIVE integers(n) 
AS (
    SELECT @min 
    UNION SELECT n + 1 FROM integers WHERE n < @max 
) SELECT n FROM integers 
+0

Je n'étais même pas au courant des CTE. J'ai l'air très prometteur. Sauf que je ne peux pas obtenir la requête que vous avez fournie pour fonctionner. Êtes-vous en mesure de fournir un échantillon complet, s'il vous plaît? – Sam7