2012-01-04 10 views
6

J'ai une table qui a min et max colonnes. Je veux rechercher des lignes où un ensemble de nombres sont entre cette plage de min et max. Exemple: J'ai un ensemble (3, 4, 11, 18).Comment filtrer un ensemble de nombres entre 2 colonnes?

  1. Mon filtrage de requête pourrait ressembler:

    (3 between min and max) OR 
    (4 between min and max) OR 
    (11 between min and max) OR 
    (18 between min and max) 
    
  2. Mais je voulais savoir s'il y a une meilleure façon quelque chose comme:

    (3,4,11,12) between min and max 
    

    qui fera semblable à # 1

J'ai besoin de thi s parce que l'ensemble peut changer entre différentes recherches. Toute aide ou suggestion est appréciée.

La table dans un contexte plus simple est class (classid, classname, minage, maxage). Il y a des milliers de classes - donc j'obtiens la requête web recherchant des classes avec des âges spécifiques par exemple (3,4,11,12) où un utilisateur cherche des classes pour les âges 3, 4, 11 et 12.

Actuellement ma requête ressemble: select * de la classe où ((3 entre min et max) OU (4 entre min et max) OU (11 entre min et max) OU (18 entre min et max)

+0

Pourriez-vous insérer votre ensemble de nombres dans une table temporaire, et joindre cela à votre table de plages, avec une clause where appropriée? –

+1

Pourriez-vous poster la structure de la table et des exemples de ce que vous voulez exactement? – Benoit

+1

Le RWTF nomme les colonnes 'min' et' max'. Cela ne troublera que les lecteurs sains. Veuillez ajouter votre définition de table et un extrait de données pour illustrer ce que vous avez l'intention de faire. – wildplasser

Répondre

0

Nous serait en mesure de vous aider plus si vous pouviez ajouter plus d'informations en publiant votre schéma de table. Toutefois, cet exemple de requête peut vous donner un indice.

Exemple de requête:

SELECT SampleValue, ColB, ColC FROM TableName WHERE SampleValue in (1,2,3)

+0

J'ai édité mon post pour donner un échantillon de ma table. Quelle est la valeur sampleValue ici? – chan

2

Quelque chose comme

SELECT * 
    FROM MyTable AS T 
WHERE EXISTS (
       SELECT * 
       FROM MySet AS S 
       WHERE S.val BETWEEN T.my_min AND T.my_max 
      ); 
+0

merci pour la réponse et cela semble bon, mais comment puis-je former MySet? Peut-il être fait dans le cadre de la requête? – chan

0

Une autre façon serait d'abord créer une table (une fois) et le remplir avec tous les âges possibles (de 1 à 101) :

CREATE TABLE Age 
(allowed TINYINT 
, PRIMARY KEY (allowed) 
) ; 

INSERT INTO Age 
    VALUES 
    (1), (2), (3), ... (101) ; 

L'utilisation de ceci dans votre requête de recherche:

SELECT * 
FROM Class 
WHERE EXISTS 
     (SELECT * 
     FROM Age 
     WHERE Age.allowed BETWEEN Class.minage AND Class.maxage 
      AND Age.allowed IN (3, 4, 11, 18) 
    ) 
+0

Non, je ne peux pas créer de table sauf si cela peut être fait dans une requête. – chan

Questions connexes