2010-11-17 57 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