一个相当简单的SQL问题

一个相当简单的SQL问题,sql,Sql,表结构: Table: People | Name | Skill1 | Skill2 | Skill3 | Skill4 | Skill5 | | Tom | Cooking | Cleaning | Eating | | | | Jane | Typing | Cooking | Sleeping | Flirting | | | John

表结构:

Table: People

| Name | Skill1     | Skill2     | Skill3     | Skill4     | Skill5     |
| Tom  | Cooking    | Cleaning   | Eating     |            |            | 
| Jane | Typing     | Cooking    | Sleeping   | Flirting   |            |
| John | Tennis     |            |            |            |            |
如果没有技能,它就是空的。 出于某种原因,我使用以下SQL得到0个结果:

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

我希望见到汤姆和简。。。但我没有,我做错什么了吗?

没有像你期望的那样工作。试着这样做:

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

此外,当您发现自己创建了多个包含相同类型数据的列时,比如
SkillX
列,是时候创建一个额外的表了。在您的情况下,创建一个表
Skills
<代码>技能应包含一个
名称
,参考
人员
表和1
技能
列。对于一个人拥有的每项技能
技能
应包含一行。从
People
表中删除
SkillX
列,因为这些列现在已过时。

您需要将每个子句作为完整测试:

select Name from People 
where Skill1 = 'Cooking'
or Skill2 = 'Cooking'
or Skill3 = 'Cooking'
or Skill4 = 'Cooking'
or Skill5 = 'Cooking'; 
其中
和每个
之间必须有一个完整的布尔测试。在脚本中,您只需调用列,这取决于您使用的SQL版本,将产生不同的结果

SQL Server提供了以下功能:

Msg 4145,15级,状态1,第1行 非布尔型表达式 在上下文中指定,其中 条件是预期的,接近“或”


最短的语法可能是:

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

@stockoverflow:颠倒逻辑-检查静态值是否在动态值中。您的数据库表设计有缺陷。技能应该是一个单独的表,它引用一个人表。然后你就可以执行一个简单的选择和连接了。