2015-09-13 6 views
0

У меня есть многопозиционный снимок, содержащий 20 значений. Пользователь может выбрать все или несколько.Как написать, где условие на основе выбранного значения

Я хочу написать запрос

  1. , если пользователь выбрал все значения, то я не хочу, чтобы передать все выбранные значения. (Я пройду 0, чтобы определить, что выбраны все значения)

  2. Если использование выбрало несколько (или не все), то я хочу передать только те выбранные значения. (I будет проходить через запятую значения экс 101.102.103.104)

На основе значений, которые я хочу написать присоединиться таблицу или использовать его в где условие

я сделал что-то вроде как следует, но это кажется, не работает.

ГДЕ: После бросали ошибки (Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.)

DECLARE @EntitiyIds AS varchar(2500) = '0' 
SELECT * 
FROM Tb_CompanyType 
WHERE Id IN (
      CASE WHEN @EntitiyIds <> '0' THEN (SELECT Item FROM dbo.Split(@EntitiyIds, ',')) 
       WHEN @EntitiyIds = '0' THEN (SELECT Id FROM Tb_CompanyType) END 
     ) 

INNER JOIN: (После не дает должного выход)

DECLARE @EntitiyIds AS VARCHAR(2500) = '101' 

SELECT * FROM Tb_CompanyType CT 
INNER JOIN Tb_Company TC ON 
         CASE WHEN @EntitiyIds = '0' AND TC.CompanyId = CT.Id THEN 1 
           WHEN @EntitiyIds <> '0' AND TC.CompanyId = (SELECT Item FROM dbo.Split(@EntitiyIds, ',')) THEN 1 END = 1 

dbo.Split возвращает таблицу, содержащую разделенные запятыми значения

Просьба помочь

ответ

2

Вы можете сделать это таким образом.

SELECT * 
FROM Tb_CompanyType 
WHERE @EntitiyIds = '0' 
     OR Id IN (SELECT Item 
        FROM dbo.Split(@EntitiyIds, ',')) 
+1

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

0

Что-то вроде этого, возможно.

SELECT Id FROM Tb_CompanyType where @EntitiyIds = '0' 
UNION ALL 
SELECT Item FROM dbo.Split(@EntitiyIds, ',') s where @EntitiyIds <> '0' 
0

Из сообщения об ошибке, предоставленного вами, кажется, что ваш подзапрос возвращает более одной строки. Вы последняя строка последнего сегмента запроса, кажется проблематичной:

DECLARE @EntitiyIds AS VARCHAR(2500) = '101' 

SELECT * FROM Tb_CompanyType CT 
INNER JOIN Tb_Company TC ON 
         CASE WHEN @EntitiyIds = '0' AND TC.CompanyId = CT.Id THEN 1 
           WHEN @EntitiyIds <> '0' AND TC.CompanyId = (SELECT Item FROM dbo.Split(@EntitiyIds, ',')) THEN 1 END = 1 

Изменения последнего

SELECT Item FROM dbo.Split(@EntitiyIds, ',') 

в

SELECT top 1 Item FROM dbo.Split(@EntitiyIds, ',') 
Смежные вопросы