Я хочу, чтобы выполнить этот запросDynamic ИНЕК в SQL Query
select * from locations where region=1 or region=2
, но в некоторых случаях, я не хочу, чтобы включить второй пункт в WHERE (or region=2
) есть способ условно запуск или заявление?
Я хочу, чтобы выполнить этот запросDynamic ИНЕК в SQL Query
select * from locations where region=1 or region=2
, но в некоторых случаях, я не хочу, чтобы включить второй пункт в WHERE (or region=2
) есть способ условно запуск или заявление?
Проверить наличие условия в заявлении где
select * from locations
where region=1
or (region=2 and @checkRegion2=1)
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
Если вы хотите 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)
Или используйте соединение: 'select * из местоположения, как l inner join @regions, как r на r.region = l.region' (должен работать, непроверен, вводиться в браузере, нет SQL Server для тестирования, ... вы знаю дрель) –
@ MichaelKjörling yep, но я предпочитаю 'in' или' exist', потому что он явно указывает, что мне не нужны поля из таблицы @regions, просто хочу отфильтровать строки из местоположения –
Вы можете использовать динамический SQL:
DECLARE @Query VARCHAR(MAX) = 'SELECT * FROM locations WHERE region=1 '
IF(@RUNAFTERBIT = 'TRUE')
BEGIN
SET @Query = @Query + ' OR REGION = 2'
END
EXEC(@Query)
Но, пожалуйста, не делайте , ** Попытайтесь придумать какой-то способ сделать это, не связанный с динамическим SQL. ** Вы теряете защиту параметров, читаемость кода, компиляцию запросов и выполнение плана выполнения и, возможно, целую кучу других вещей. В лучшем случае он будет работать одинаково. В худшем случае вы пожертвуете большим количеством результатов без прибыли. –
@ MichaelKjörling Обычно динамический SQL - это мой последний способ делать подобные вещи, однако по моему опыту иногда он может даже работать лучше (если случай где огромный и сложный и зависит от многих параметров). Не в этом случае, наверняка –
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 .
Я бы настоятельно рекомендовал, чтобы для поддерживаемого кода вы должны явно указывать столбцы, а не использовать 'select *'. Если код в вопросе только для иллюстрации, этот комментарий может не применяться. –