2013-09-15 3 views
2

Я хочу, чтобы выполнить этот запросDynamic ИНЕК в SQL Query

select * from locations where region=1 or region=2 

, но в некоторых случаях, я не хочу, чтобы включить второй пункт в WHERE (or region=2) есть способ условно запуск или заявление?

+0

Я бы настоятельно рекомендовал, чтобы для поддерживаемого кода вы должны явно указывать столбцы, а не использовать 'select *'. Если код в вопросе только для иллюстрации, этот комментарий может не применяться. –

ответ

2

Проверить наличие условия в заявлении где

select * from locations 
where region=1 
or (region=2 and @checkRegion2=1) 
0
DECLARE @RUNAFTERBIT VARCHAR(10) 
SET @RUNAFTERBIT = 'TRUE' 

IF @RUNAFTERBIT = 'TRUE' 
    SELECT * FROM LOCATIONS WHERE REGION = 1 OR REGION = 2 
ELSE 
    SELECT * FROM LOCATIONS WHERE REGION = 1 
END IF 
2

Если вы хотите genralizable запрос, вы можете объявить табличную переменную для этого (я предполагаю, что вы используете сервер SQL):

declare @regions table (id int primary key) 

, а затем заполнить его в зависимости от состояния:

insert into @regions select 1 
if @use2 = 1 
    insert into @regions select 2 

теперь вы можете запустить этот запрос:

select * 
from location as l 
where exists (select * from @regions as r where r.id = l.region) 

или

select * 
from location as l 
where l.region in (select r.id from @regions as r) 
+0

Или используйте соединение: 'select * из местоположения, как l inner join @regions, как r на r.region = l.region' (должен работать, непроверен, вводиться в браузере, нет SQL Server для тестирования, ... вы знаю дрель) –

+0

@ MichaelKjörling yep, но я предпочитаю 'in' или' exist', потому что он явно указывает, что мне не нужны поля из таблицы @regions, просто хочу отфильтровать строки из местоположения –

0

Вы можете использовать динамический SQL:

DECLARE @Query VARCHAR(MAX) = 'SELECT * FROM locations WHERE region=1 ' 

IF(@RUNAFTERBIT = 'TRUE') 
BEGIN 
    SET @Query = @Query + ' OR REGION = 2' 
END 

EXEC(@Query) 
+0

Но, пожалуйста, не делайте , ** Попытайтесь придумать какой-то способ сделать это, не связанный с динамическим SQL. ** Вы теряете защиту параметров, читаемость кода, компиляцию запросов и выполнение плана выполнения и, возможно, целую кучу других вещей. В лучшем случае он будет работать одинаково. В худшем случае вы пожертвуете большим количеством результатов без прибыли. –

+0

@ MichaelKjörling Обычно динамический SQL - это мой последний способ делать подобные вещи, однако по моему опыту иногда он может даже работать лучше (если случай где огромный и сложный и зависит от многих параметров). Не в этом случае, наверняка –

0

CASE выражение может быть использовано для выполнения оценки короткого замыкания в соответствии с некоторыми обстоятельства:

declare @AlternateRegion as Int = 2; 

select * 
    from Locations 
    where case 
    when Region = 1 then 1 
    when @AlternateRegion is not NULL then 
     case when Region = @AlternateRegion then 1 else 0 end 
    else 0 
    end = 1 

CASE не надежно обеспечивает оценку короткого замыкания при наличии функций агрегации. См. CASE/COALESCE won't always evaluate in textual order и Aggregates Don't Follow the Semantics Of CASE .