Где 'foo' ИЛИ ​​'bar' И 'lol' ИЛИ ​​'rofl' MySQL - PullRequest
4 голосов
/ 24 ноября 2010

В каком порядке это будет оцениваться.Мое намерение состоит в том, что если он найдет либо foo, либо bar, он также будет искать lol и rofl.
Это полностью в лесу?И если да, то как можно оценить такое выражение?

Ответы [ 4 ]

6 голосов
/ 24 ноября 2010

Оператор AND имеет более высокий приоритет, чем OR в MySql , поэтому ваше текущее выражение оценивается как:

WHERE 'foo' OR ('bar' AND 'lol') OR 'rofl'

Добавьте скобки к выражению, если вы хотите форсировать порядок вычисления:

WHERE ('foo' OR 'bar') AND ('lol' OR 'rofl')
4 голосов
/ 24 ноября 2010
Сначала будет обработано

AND, после чего будет обработано OR. Итак, это будет:

'foo' OR ('bar' AND 'lol') OR 'rofl'

После этого слева направо порядок.

1 голос
/ 24 ноября 2010

посмотрите на документацию - И имеет более высокий приоритет, поэтому это будет выглядеть так:

WHERE 'foo' OR ( 'bar' AND 'lol' ) OR 'rofl'
0 голосов
/ 24 ноября 2010
SELECT
  Id, Name
FROM
  TestTable
WHERE
    (Name = 'foo') OR (Name = 'bar') AND (Name = 'lol') OR (Name = 'rofl')

В MS SQL Server даст вам следующий результат:

1 foo
4 rofl

Так что, похоже, он объединит bar и lol и изменит foo и rofl по отдельности так:

SELECT
      Id, Name
    FROM
      TestTable
    WHERE
        (Name = 'foo') OR ((Name = 'bar') AND (Name = 'lol')) OR (Name = 'rofl')

Что вы, вероятно, хотите сделать (технически):

SELECT
      Id, Name
    FROM
      TestTable
    WHERE
        ((Name = 'foo') OR (Name = 'bar')) AND ((Name = 'lol') OR (Name = 'rofl'))
...