Почему в MS SQL нет математической функции In Where? - PullRequest
0 голосов
/ 21 апреля 2009

Большинство SQL-запросов не имеют математической операции над предложением where.

Что плохого в том, что они в предложении "где"? Есть ли проблемы с производительностью?

Например:

ВЫБРАТЬ * ОТ РАБОТНИКА ГДЕ Зарплата * 3 = 5000

Ответы [ 3 ]

11 голосов
/ 21 апреля 2009

Если предложение where может использовать индекс, это часто (но не всегда) быстрее. Использование математической операции в поле остановит использование индекса.

Например, если у вас была таблица с миллионом строк и столбец даты, который был проиндексирован, запрос 1 здесь намного превзошел бы запрос 2 (они оба извлекают все строки с датой за последние 7 дней):

запрос 1:

select date from table where date > dateadd(d, -7, getdate())

запрос 2:

select date from table where dateadd(d, 7, date) > getdate()

В вашем примере запрос будет гораздо лучше:

select * from employee where salary = (5000 / 3)
2 голосов
/ 21 апреля 2009

А? Нет, нет ничего плохого в математике в предложении where. Предложение where может содержать любое выражение, которое использует имена столбцов, функции или константы, если выражение является допустимым предикатом.

ck приводит следующие два примера:

выберите дату из таблицы, где date> dateadd (d, -7, getdate ())

выберите дату из таблицы, где dateadd (d, 7, date)> getdate ()

и объясняет, что первое, вероятно, быстрее, потому что оно может использовать индекс.

ck правильно, но следует также отметить, что первое может быть быстрее, потому что dateadd(d, -7, getdate()) является константным выражением (его нужно вычислять только один раз, независимо от количества строк), тогда как для dateadd(d, 7, date) во втором необходимо оценивается для каждой строки.

Но оба примеров ck являются примерами "математики" (выражений), используемой в предложении where, о котором спрашивает OP.

1 голос
/ 21 апреля 2009

Можете ли вы привести пример ... вы можете использовать предложение HAVING после предложения WHERE с определенными функциями

SELECT filter, count(*) FROM Test GROUP BY filter HAVING count(*) > 1

Та же логика применяется, если вы хотите использовать предложения HAVING для MAX, MIN и т. Д. *

Для вашего примера вам нужно заключить в скобки Зарплату * 3

WHERE (Salary * 3) > 5000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...