2012-06-27 2 views
0

Мне нужно решение для условного предложения WHERE в SQL Server. Я не могу понять, как добавить функции в предложение WHERE в зависимости от объявленных переменных. Я кронштейн условных частей с необходимой логикойУсловие условного WHERE

DECLARE @distance bigint 
DECLARE @photosneeded bigint 

SET @distance * 50 

SELECT * FROM users u 
WHERE 
    [IF @distance > 0 THEN distance_function(lat1,lon1,lat2,lon2)<[email protected] END] 
    AND 
    [IF @photosneeded>0 THEN u.photo IS NOT NULL AND u.photo <>'' END] 
+1

http://en.wikipedia.org/wiki/Truth_table#Logical_implication – biziclop

ответ

5

Это может быть сделано с помощью равнины ИНЕКЕ:

SELECT * FROM users u 
WHERE 
(@distance <= 0 or (distance_function(lat1,lon1,lat2,lon2)<[email protected])) 
AND 
(@photosneeded <= 0 or (u.photo IS NOT NULL AND u.photo <>'')) 

Однако вы должны быть осторожны с таким родом состояние в предложении, потому что это действительно может испортить оптимизацию плана выполнения. См. Ответ @ Iain для получения дополнительной информации о том, почему.

+0

В данном конкретном случае, я в порядке с планом выполнения на SQL? – Patriotec

+0

Ваш пробег может отличаться. Я ничего не вижу в документах «Что нового» для SQL Server 2012, но это не значит, что он не изменился. Вы должны просто знать, что, хотя он будет работать логически, производительность может быть невелика, и решение Iain почти наверняка будет работать лучше. –

3

Мой совет будет заключаться в трех отдельных процедурах - один для полного запроса, просто используя первое предложение, другое для полного запроса, просто используя второе предложение, а третье - как «мастер», которое вызывает либо одно зависящее при условии. В прошлом были проблемы с тем, что SQL Server составлял только первую используемую ветвь условного предложения (я не уверен, имеет ли это отношение к 2008 году), поэтому использование отдельных хранимых процедур защищает вас от этого, и это простой способ организовать вещи.

+0

Я уверен, что это все еще проблема в 2008 году, - таким образом, предупреждение в нижней части моего ответа. Я думаю, что ваш ответ объясняет основную причину более четко. –

+2

Вот как это сделать, я нашел тот же совет в книге «Учебный комплект MCTS Self-Paced Training (Экзамен 70-433):« Разработка баз данных Microsoft® SQL Server 2008 », поэтому он по-прежнему применяется к SQL Server 2008. Выполнение использование плана оптимизировано, поскольку несколько простых планов многократного использования легко сочетаются в плане выполнения, принадлежащем хранимой процедуре «master». –

+0

Спасибо @ChrisShain, я думаю, вы избили меня до ответа на 16 секунд! :) Интересно посмотреть, как это можно сделать со стандартным предложением where. – iain

0
SELECT * FROM users u 
WHERE 
(@distance <= 0 or distance_function(lat1,lon1,lat2,lon2)<[email protected]) 
and 
(@photosneeded <= 0 or isnull(u.photo, '') <> '') 
Смежные вопросы