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