2010-11-17 56 views
2

表结构:一个相当简单的SQL问题

Table: People 

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

如果没有技巧,它仅仅是NULL。 出于某种原因,我使用下面的SQL得到0的结果:

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

我希望看到汤姆和简...但我不这样做,我做错了什么?

+0

你的数据库表的设计是有缺陷的。技能应该是一个引用人表的单独表格。然后,您将能够执行简单的选择和连接。 – Phrogz 2010-11-17 08:02:59

+0

不要担心,这不是我的表格:D我刚刚举了一个快速示例。 – stockoverflow 2010-11-17 08:10:12

回答

7

最短的语法可能是这一个:

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

好主意来扭转它。 – cjk 2010-11-17 08:08:14

+0

谢谢,这看起来干净,将是最好的答案...现在在MySQL上进行测试... – stockoverflow 2010-11-17 08:11:25

+0

LEGENDARY。有用。 @ck:反向? – stockoverflow 2010-11-17 08:17:21

4

or不能按照您的预期工作。试着这样说:

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

此外,当你发现自己创建的多个列与同类在它的数据,如您SkillX列,它的时间来创建一个额外的表。在你的情况下,制作一个表SkillsSkills应该包含Name,参考People表和1 Skill列。对于一个人拥有的每种技能Skills应该包含一行。从People表中删除SkillX列,因为这些列现已过时。

+0

感谢您的设计提示! – stockoverflow 2010-11-17 08:16:58

5

你需要每个子句是一个完整的测试:

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

where每个or必须有一个完整的布尔测试之间。在您的脚本中,您只需调用该列,这取决于您使用的SQL版本会有不同的结果。

SQL Server可以这样:

消息4145,15级,状态1,第1行中指定的上下文非布尔型 的 表达式,其中一个 条件预计,不久的 'OR' 。

+0

我使用MySQL,会给它一个镜头,谢谢 – stockoverflow 2010-11-17 08:12:11