2010-11-17 2 views
2

Структура таблицы:Довольно простая задача SQL

Table: People 

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

Где нет навыка, это просто NULL. По некоторым причинам я получаю 0 результатов, используя следующий SQL:

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

я ожидал увидеть Тома и Джейн ... но я не делаю, я делаю что-то не так?

+0

Ваш дизайн таблицы базы данных является ошибочным. Навыки должны быть отдельной таблицей, которая ссылается на таблицу людей. Затем вы сможете выполнить простой выбор и присоединиться. – Phrogz

+0

Не беспокойтесь, это не мой стол: D Я просто бросил быстрый пример. – stockoverflow

ответ

7

Самый короткий синтаксис может быть такой:

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

Хорошая идея отменить его. – cjk

+0

Спасибо, это выглядит чистым и будет лучшим ответом ... Тестирование на MySQL теперь ... – stockoverflow

+0

LEGENDARY. Оно работает. @ck: обратный? – stockoverflow

4

or не работает, как вы ожидаете. Попробуйте так:

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

Кроме того, когда вы оказываетесь созданием нескольких столбцов с таким же в нем данные, как ваши SkillX колонны, пришло время, чтобы создать дополнительную таблицу. В вашем случае сделайте таблицу Skills. Skills должен содержать Name, ссылаясь на таблицу People и 1 Skill. Для каждого навыка, которым обладает человек Skills, должна содержаться одна строка. Удалите столбцы SkillX из таблицы People, так как они устарели.

+0

Спасибо за подсказку! – stockoverflow

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, уровень 15, состояние 1, строка 1 выражение не-логического типа , указанного в условиях, когда состояние ожидается, рядом с 'ИЛИ' ,

+0

Я использую MySQL, дам ему шанс спасибо – stockoverflow

Смежные вопросы