2013-03-26 3 views
0

не могу понять это ...Условный повторное использование подзапроса

Sql хранимая процедура имеет необязательный аргумент, скажем, в id(int). Для простоты, скажем, я должен вернуть набор результатов с дополнительными ...and [email protected], если аргумент не равен нулю. Если нет, я просто возвращаю результат.

Как избежать двукратного написания «ядра» запроса? CTE на помощь?

ответ

1

вы можете попробовать:

select * from myTable where id = isnull(@id, id) 

Если @id является недействительным запрос сравнить свою собственную колонку идентификационных себе, что всегда верно, в противном случае это параметр используется.

+0

Я вижу идею. Но, как я уже сказал, запрос сложный, задаваясь вопросом, нужно ли мне беспокоиться о любых проблемах с производительностью при добавлении isnull(), где мне нужна проверка, вместо того, чтобы писать два запроса отдельно. – Brian

+0

Это будет иметь эффект (может быть, немного) на производительность, но если вы не хотите второго запроса, вы не можете этого избежать :) – aweis

2

Вы могли бы сделать

where .... and (@id is null or id = @id) 
+0

Меня интересует, что вы думаете о моем комментарии к ответу «aweis». Спасибо – Brian

+0

Это тоже должно работать. Я предпочитаю использовать Или, поскольку его легче читать, когда я просматриваю код через несколько недель после его написания. –

+0

нет, мой вопрос касался проблемы с производительностью, когда мы добавляем новое ограничение – Brian

Смежные вопросы