2014-10-18 4 views
1

У меня есть следующие данные в моей таблице:Sql запрос, где состояние и или

ID: 1, имя: TOM, видно: 1, field_1: EMPTY, field_2: EMPTY, field_3: EMPTY.

SELECT id, name FROM table 
WHERE name <> 'TOM' AND visible = 1 
     AND field_1 <> '' OR field_2 <> '' OR field_3 <> '' 

Я хочу, чтобы выбрать только те строки, в которых имя отличается от «имя1» и по крайней мере один из полей не пусто.

Я не ожидал результатов для этого запроса, но я получаю: id, TOM, как и где условие имени перезаписывается.

+0

Определите «пустой». Вы имеете в виду пустой, пустой или буквально текст «EMPTY»? – Bohemian

+0

Можете ли вы предоставить sqlfiddle своими данными – user4035

+0

пустое поле, field_1 2 и 3 - varchars. помилование – im7xs

ответ

1

Я подозреваю, что один из поля действительно = «», что делает условия действительны для записи «Том»!. Вы должны группа OR условия, используя скобки:

SELECT id, name FROM table 
WHERE name <> 'TOM' AND visible = 1 
     AND (field_1 <> '' OR field_2 <> '' OR field_3 <> '') 
1

Оператор and имеет более высокий приоритет, чем or (см the documentation для дополнительных деталей), так что если мы возьмем запрос:

SELECT id, name FROM table 
WHERE name <> 'TOM' AND visible = 1 
     AND field_1 <> '' OR field_2 <> '' OR field_3 <> '' 

И добавить разъяснении круглые скобки, мы получим:

SELECT id, name FROM table 
WHERE (name <> 'TOM' AND visible = 1 AND field_1 <> '') 
     OR field_2 <> '' 
     OR field_3 <> '' 

Это не то, что вы хотели. Вы можете решить эту проблему, явно добавляя скобки:

SELECT id, name 
FROM table 
WHERE name <> 'TOM' AND 
     visible = 1 AND 
     (field_1 <> '' OR field_2 <> '' OR field_3 <> '') 
2

Ваша проблема является старшинство: кронштейн ОШ:

SELECT id, name 
FROM table 
WHERE name <> 'TOM' 
AND visible = 1 
AND (field_1 <> '' OR field_2 <> '' OR field_3 <> '') 
1

Вы должны добавить()

SELECT id, name 
FROM table 
WHERE name <> 'TOM' 
AND visible = 1 
AND (field_1 <> ''OR field_2 <> '' OR field_3 <> '') 
1

Пожалуйста, вмещающие пустое сравнение полей в один блок анализа, как показано жирным шрифтом SELECT id, name FROM table WHERE name <> 'TOM' AND visible = 1 И ( field_1 <> '' ИЛИ ​​field_2 <> '' ИЛИ ​​field_3 <> '')

1
  1. Вы должны вставить скобки
  2. ли пустые поля действительно пусто? Возможно, '' не приносит правильные результаты.
Смежные вопросы