Использование оператора ИЛИ - SQL Server - PullRequest
0 голосов
/ 10 февраля 2019

Я читаю документацию об операторе ИЛИ, там написано:

Большинство лучших СУБД даже не будет оценивать второе условие в предложении ИЛИ ГДЕ, если первое условие уже выполнено.(Если первое условие выполнено, строка будет извлечена независимо от второго условия).

SELECT prod_code, prod_price
FROM Articles
WHERE Code = '1' OR Code = '2'

Имеет ли это ввиду документацию, если запрос Code = '1' вернет все значения с '1игнорирование второго условия WHERE Code = '2'.

Я проверил это на SQL Server, и он возвращает все значения с 1 и все значения с 2, поэтому фактически 2 строки ....

Так что я немного запутался здесь?

Спасибо, ура

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Ваше примерное условие поиска:

Code = '1' OR Code = '2'

Это логическое выражение, которое само состоит из двух суббулевых выражений в сочетании с OR.

  • Code = '1'
  • Code = '2'

В SQL логические выражения могут иметь три возможных значения истинности true, false, unknown.

При объединении выражений с AND или OR таблицы истинности могут использоваться для расширения всех возможных результатов.Таблица истинности для OR приведена ниже.

╔═════════╦══════╦═════════╦═════════╗
║         ║ TRUE ║  FALSE  ║ UNKNOWN ║
╠═════════╬══════╬═════════╬═════════╣
║ TRUE    ║ TRUE ║ TRUE    ║ TRUE    ║
║ FALSE   ║ TRUE ║ FALSE   ║ UNKNOWN ║
║ UNKNOWN ║ TRUE ║ UNKNOWN ║ UNKNOWN ║
╚═════════╩══════╩═════════╩═════════╝

Из рассмотрения таблицы выше видно, что если вы знаете, что одно из подвыражений является истинным, не имеет значения, какое значение имеет другое выражение,Значение общего комбинированного выражения по-прежнему будет true, поэтому нет необходимости даже оценивать его.

SQL Server может выполнять оценку короткого замыкания, но это не гарантируетчто он будет .

Кроме того, он может разработать план выполнения, в котором два предиката даже не имеют отношения к совместной оценке.Потенциально может возникнуть план запроса в вопросе, который содержит оператор поиска по индексу с двумя запросами.Один в Code = '1' и один в Code = '2'.

Отдельная оценка предиката теперь может быть удалена из плана выполнения, поскольку гарантируется, что объединенные результаты этих поисков индекса будут соответствовать предложению WHERE ипоэтому нет необходимости делать какие-либо дополнительные оценки предикатов, помимо того, что происходит в рамках этих поисков.

0 голосов
/ 10 февраля 2019

Извлечено из моего исходного комментария: Это означает, что если строка удовлетворяет условию Code = 1, то она не будет оценивать предложение Code = 2 для этой строки.Это не значит, что он останавливает проверку остальных строк.СУБД будет по-прежнему возвращать каждую строку, которая удовлетворяет любому из этих требований.

Так что, если у нас есть таблица типа:

CREATE TABLE YourTable (ID int IDENTITY,
                        Code int,
                        SomeValue varchar(10));
INSERT INTO YourTable (Code,SomeValue)
VALUES (1,'asdkjsa'),
       (1,'asdojsa'),
       (2,'saohdsald'),
       (3,'sdfkjhsadk'),
       (3,'asdkjsagd');

Если вы должны выполнить запрос SELECT * FROM YourTable WHERE Code = 1 OR Code = 2;, то длявторые первые 2 строки, OR Code = 2 не будет оцениваться, так как Code = 1 уже оценил true.

Однако вместо использования WHERE Code = 1 OR Code = 2 вы можете использовать более краткий оператор IN: WHERE Code IN (1,2).

0 голосов
/ 10 февраля 2019

Означает ли это под документацией, что запрос Code = '1' вернет все значения с '1', игнорируя второе условие WHERE Code = '2'.

Каждая строка имеет 1 значение в столбце Code.Когда таблица сканируется, проверяются условия в предложении WHERE.Если используемые вами rdbms выполняют оценку короткого замыкания , то в случае OR:если значение скажет '1', то оно также не будет сравниваться с '2', поскольку оно не нужно и переходит к следующей строке.Если значение не '1', тогда выполняется другое сравнение с '2'.Итак, чтобы ответить на ваш вопрос:Строки с Code = '2' не игнорируются.Это проверка состояния , которая игнорируется, когда не нужна .

0 голосов
/ 10 февраля 2019

Заявление просто об оптимизации, что называется "короткое замыкание".Это говорит о том, что сравнение с 2 не выполняется, когда 1 соответствует условию.Потому что не имеет значения, к чему относится сравнение с 2.

Вы, кажется, немного смущены, говоря:

, если запрос Code = '1' вернет все значенияс '1' игнорируя второе условие WHERE Code = '2'.

Code - это столбец в каждой строке, а не общее значение, которое является постоянным для всех строк.(Если это так, это будет @Code в SQL Server, а не @Code.)

Для вашего примера, однако, вы должны использовать IN:

WHERE Code IN ('1', '2')

И, если Code является числовым, то значения сравнения не должны иметь одинарные кавычки.

...