2016-05-20 7 views
0

Мой скрипт имеет переменную, которая не всегда содержит значение. Если есть значение, мне нужен дополнительный пункт WHERE.Условие в предложении WHERE

DECLARE @identityUserIds NVARCHAR; 
SELECT @identityUserIds = (SELECT TOP (1) [userIdsCsv] FROM [identityUsers]) 

SELECT * 
FROM [Users] 
-- IF (!ISNULL(@identityUserIds) OR @identityUserIds != '') 
WHERE [ID] in (@identityUserIds) 
-- ELSE (no extra condition) 

Как это сделать?

+3

Я подозреваю, что ваш 'в' условие не будет работать так, как вы хотите его, потому что' значение userIdsCsv' это просто строка с запятыми в нем, а не набором чисел. Сначала вам нужно разбить его, например. как описано [здесь] (http://stackoverflow.com/questions/3735152/most-succinct-way-to-transform-a-csv-string-to-an-table-in-tsql) – Rhumborl

+0

Это правильно, но вот только псевдо-код, иллюстрирующий реальную проблему. Спасибо за ссылку! –

ответ

1

Обычный способ сделать это:

... where @identityUserIds is null or ID in (@identityUserIds) 
+0

Я не уверен, но не так ли '@identityUserIds! = ''' Важна часть? –

+0

@ RenéVogt Возможно, в зависимости от того, разрешает ли 'userIdsCsv' и/или может содержать пустые строки –

+0

Я предположил, что это происходит, потому что это было частью запроса OP. –

0

Я думаю, что это может быть просто сделано с OR:

SELECT * 
FROM [Users] 
WHERE Len(ISNULL(@identityUserIds,''))=0 
    OR [ID] IN (@identityUserIds) 

Но обратите внимание, что @ комментарий Rhumborl является правильным, IN заявление будет не работает со строкой. К несчастью, у меня нет немедленного решения для , что проблема.