一个相当简单的SQL问题

时间:2010-11-17 07:58:55

标签: 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';

我希望看到汤姆和简......但我没有,我做错了什么?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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提供了这个:

  

Msg 4145,Level 15,State 1,Line 1 An   表达非布尔类型   在上下文中指定的   条件是预期的,靠近'OR'。

答案 2 :(得分: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的每项技能应该包含一行。从SkillX表中删除People列,因为这些列现已过时。