2013-12-19 2 views
1

У меня есть следующий запрос:SQL возвращает поиск, даже если проверка не должна

SELECT * FROM project WHERE year = 11 AND orderDate LIKE ? OR orderNo LIKE ? OR prodNo LIKE ? OR prodName LIKE ? OR inquiryDate LIKE ? OR confirmDate LIKE ? OR deliveryLT LIKE ? OR deliveryRiis LIKE ? OR signsPrice LIKE ? OR vrPrice LIKE ? OR deliveryPrice LIKE ? OR unexpectPrice LIKE ? OR riisBonus LIKE ? OR kennBonus LIKE ? OR profit LIKE ? OR profitPercent LIKE ? OR quantity LIKE ?; 

Проблема заключается в том, хотя колонка год не 11, я все еще получаю данные, это потому, что я использую OR? (Значки вопросов используются, потому что я использую подготовленные записи).

Когда я

SELECT * FROM project WHERE year = 11 AND orderDate LIKE ? ; 

Он отлично работает, так что я, полагая, что это OR? Если да, то как я могу это решить? Я хочу, чтобы один из тех, кто был правдой, и год был на 100% правдой;

ответ

0

Да; И обрабатывается до OR, поэтому вы, по сути, запрашиваете все проекты, где year = 11 and orderDate LIKE ? или если выполнены какие-либо другие условия.

Вам необходимо использовать круглые скобки, чтобы четко указать, какие условия применяются к AND и которые должны быть OR ред.

Я предположил бы, что вы хотите, чтобы это выглядело примерно так:

SELECT * FROM project WHERE year = 11 AND (orderDate LIKE ? OR orderNo LIKE ? OR prodNo LIKE ? OR prodName LIKE ? OR inquiryDate LIKE ? OR confirmDate LIKE ? OR deliveryLT LIKE ? OR deliveryRiis LIKE ? OR signsPrice LIKE ? OR vrPrice LIKE ? OR deliveryPrice LIKE ? OR unexpectPrice LIKE ? OR riisBonus LIKE ? OR kennBonus LIKE ? OR profit LIKE ? OR profitPercent LIKE ? OR quantity LIKE ?) 
+0

Спасибо большое, я не был осведомлен о том, что часть syntax..makes толку, хотя, я попытаюсь это сейчас, вернется с результатом. отлично работает, большое вам спасибо. Я соглашусь через 9 минут, когда мне позволено, вы были так быстро: D – allegroBegin

1

SQL rules of precedence утверждают, что «и» предшествует «или», так что ваш SQL эквивалентно:

SELECT * FROM project WHERE (year = 11 AND orderDate LIKE ?) OR orderNo LIKE ? 
OR prodNo LIKE ? OR prodName LIKE ? OR inquiryDate LIKE ? 

изменить его с помощью добавленных скобок в соответствии с вашими требованиями:

SELECT * FROM project WHERE year = 11 AND 
(orderDate LIKE ? OR orderNo LIKE ? 
    OR prodNo LIKE ? OR prodName LIKE ? OR inquiryDate LIKE ?) 
Смежные вопросы