2010-11-17 7 views
2

Tableau structure:Un problème SQL assez simple

Table: People 

| Name | Skill1  | Skill2  | Skill3  | Skill4  | Skill5  | 
| Tom | Cooking | Cleaning | Eating  |   |   | 
| Jane | Typing  | Cooking | Sleeping | Flirting |   | 
| John | Tennis  |   |   |   |   | 

Lorsqu'il n'y a pas compétence, il est juste NULL. Pour une raison quelconque, je reçois 0 résultats en utilisant l'instruction SQL suivante:

select Name from People 
where Skill1 or Skill2 or Skill3 or Skill4 or Skill5 = 'Cooking'; 

J'attends de voir Tom et Jane ... mais je ne le fais pas, je fais quelque chose de mal?

+0

Votre conception de la table de base de données est erronée. Les compétences devraient être une table distincte qui fait référence à une table de personnes. Ensuite, vous seriez en mesure d'effectuer un simple sélectionner et rejoindre. – Phrogz

+0

Ne vous inquiétez pas ce n'est pas ma table: D Je viens de jeter un exemple rapide. – stockoverflow

Répondre

7

La syntaxe plus courte peut être celle-ci:

select Name 
from People 
where 'Cooking' IN (
    Skill1, 
    Skill2, 
    Skill3, 
    Skill4, 
    Skill5); 
+1

Bonne idée pour l'inverser. – cjk

+0

Merci, cela semble propre et serait la meilleure réponse ... Test sur MySQL maintenant ... – stockoverflow

+0

LEGENDARY. Ça marche. @ck: inverse? – stockoverflow

4

or ne fonctionne pas comme prévu. Essayez comme ceci:

select Name from People 
where Skill1 = 'Cooking' or Skill2 = 'Cooking' or Skill3 = 'Cooking'or Skill4 = 'Cooking' or Skill5 = 'Cooking'; 

De plus, lorsque vous vous trouvez la création de plusieurs colonnes avec le même genre de données qu'il contient, comme vos SkillX colonnes, il est temps de créer une table supplémentaire. Dans votre cas, créez une table Skills. Skills doit contenir un Name, en se référant à la table People et à la colonne 1 Skill. Pour chaque compétence qu'une personne possède Skills doit contenir une ligne. Supprimez les colonnes SkillX du tableau People car elles sont désormais obsolètes.

+0

Merci pour le conseil de conception! – stockoverflow

5

Vous devez chaque clause pour être un test complet:

select Name from People 
where Skill1 = 'Cooking' 
or Skill2 = 'Cooking' 
or Skill3 = 'Cooking' 
or Skill4 = 'Cooking' 
or Skill5 = 'Cooking'; 

Entre le where et chaque or il doit y avoir un test booléen complet. Dans votre script, vous appelez simplement la colonne qui, selon la version de SQL que vous utilisez, aura des résultats différents.

SQL Server donne ceci:

Msg 4145, niveau 15, état 1, ligne 1 Une expression de type non booléen spécifié dans un contexte où une condition devrait, près de 'OR' .

+0

J'utilise MySQL, je vais essayer – stockoverflow