Три слова: порядок операций. Как вы узнали в математике, некоторые операторы имеют приоритет над другими (например, умножение происходит перед сложением), если вы не используете скобки, чтобы сделать это по-своему. В этом случае AND
имеет более высокий приоритет, чем OR
.
Без добавления ваших собственных скобок ваше предложение WHERE
будет оцениваться следующим образом:
Upper( UI_DISPLAYNAME ) LIKE Upper( '%smith%' )
OR
(Upper( OBJ_TITLE ) LIKE Upper( '%smith%' )
AND OBJ_ID IN (select obj_id from PITS_OBJECT where
...)
Но когда вы вручную добавляете эти скобки, вы заставляете OR
быть оцененным первым.
(Upper( UI_DISPLAYNAME ) LIKE Upper( '%smith%' )
OR Upper( OBJ_TITLE ) LIKE Upper( '%smith%' ))
AND OBJ_ID IN (select obj_id from PITS_OBJECT where
...
Редактировать: Я должен прямо ответить на ваш вопрос о том, почему вы получаете больше данных. Причина в том, что без круглых скобок двигатель замкнет свою проверку, если обнаружит, что строка 7 верна. Другими словами, он будет включать все записи, где Upper( UI_DISPLAYNAME ) LIKE Upper( '%smith%' )
, независимо от других критериев.
Когда вы добавляете эти скобки, логика меняется. Он будет включать записи, где Upper( UI_DISPLAYNAME ) LIKE Upper( '%smith%' ) OR Upper( OBJ_TITLE ) LIKE Upper( '%smith%' )
, а затем проверяет, удовлетворяет ли запись ТАКЖЕ внутреннему выбору, который начинается в строке 12. Эти дополнительные записи не отображаются, поскольку они не соответствуют критериям этого внутреннего выбора.