Объяснение не имеет ничего общего с LIKE NULL
или IN ( )
.
Булевы выражения следуют порядку приоритета оператора, так же как арифмети c.
В арифметике c, вы, возможно, помните, что умножение имеет более высокий приоритет, чем сложение:
A + B * C
Без скобок это работает точно так же:
A + (B * C)
Если вы хотите, чтобы сложение оценивалось первым, вы необходимо использовать скобки для переопределения приоритета оператора по умолчанию:
(A + B) * C
Аналогично, в логических выражениях AND
имеет более высокий приоритет, чем OR
.
A OR B AND C
Работает так:
A OR (B AND C)
Если вы хотите, чтобы OR
оценивался первым, вы должны использовать скобки, чтобы переопределить приоритет оператора по умолчанию:
(A OR B) AND C
Как это объясняет то, что вы видите?
WHERE tsee.CCID IN (4590) OR tsee.CCID LIKE null
AND tsd.StatusID != 3
Это работает так, как если бы вы сделали:
WHERE tsee.CCID IN (4590) OR (tsee.CCID LIKE null
AND tsd.StatusID != 3)
Так что, если он находит строку с CCID 4590, эта строка удовлетворяет всему предложению WHERE, потому что true OR (anything)
все еще верно .