фильтр по нескольким столбцам с переменными - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица SQL, которая выглядит следующим образом:

enter image description here

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]

Я хотел бы иметь возможность фильтровать столбцы в зависимости от значений моих переменных

E.G иногда только @BI_ResponsibleID, иногда @CategoryID и @ChangeRequestorID и т. Д. .....

Возможно ли это с моими переменными?

Ответы [ 6 ]

0 голосов
/ 26 апреля 2018

Что вам нужно сделать, это включить OR условие для проверки NULL таких параметров:

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

Вы можете сделать это через сохраненный процесс, например:

CREATE PROCEDURE MyProcName
    @BI_ResponsibleID = NULL
    @CategoryID = NULL
    @ChangeRequestorID = NULL

AS

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE 
    (BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL)
    AND (CategoryID = @CategoryID OR @CategoryID IS NULL)
    AND (ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL)

END
0 голосов
/ 26 апреля 2018
DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE ( BI_ResponsibleID = @BI_ResponsibleID OR @BI_ResponsibleID IS NULL )
      AND ( CategoryID = @CategoryID OR @CategoryID IS NULL )
      AND ( ChangeRequestorID = @ChangeRequestorID OR @ChangeRequestorID IS NULL )
0 голосов
/ 26 апреля 2018

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

DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE ( 1 = 1 OR ( @BI_ResponsibleID IS NOT NULL AND  Some Other condition using @BI_ResponsibleID))
    AND ( 1 = 1 OR ( @CategoryID IS NOT NULL AND  Some Other condition using @CategoryID))
    AND ( 1 = 1 OR ( @ChangeRequestorID IS NOT NULL AND  Some Other condition using @ChangeRequestorID))
0 голосов
/ 26 апреля 2018

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

// Not tested code
DECLARE @BI_ResponsibleID INT , @CategoryID  INT , @ChangeRequestorID INT 
DECLARE @sqlCommand nvarchar(1000)


SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SET @sqlCommand = 'TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity] where 1 = 1 '

if(@BI_ResponsibleID != 0)
 set @sqlCommand +=  'AND BI_ResponsibleID = @BI_ResponsibleID '

 if(@CategoryID != 0)
 set @sqlCommand +=  'AND CategoryID = @CategoryID ' 

 if(@ChangeRequestorID != 0)
 set @sqlCommand +=  'AND ChangeRequestorID = @ChangeRequestorID '

EXEC sp_executesql @sqlCommand, N'@BI_ResponsibleID INT, @CategoryID INT, @ChangeRequestorID INT', @BI_ResponsibleID, @CategoryID, @ChangeRequestorID;
0 голосов
/ 26 апреля 2018

Мое решение для вас:

Использование значения по умолчанию для нулевого параметра, подобного этому

SET @BI_ResponsibleID = ISNULL(@BI_ResponsibleID, 0 );
SET @CategoryID = ISNULL(@CategoryID, 0 );
SET @ChangeRequestorID = ISNULL(@ChangeRequestorID, 0 );

И попробуйте это:

SELECT TOP 4
      [BI_ResponsibleID],
      [CategoryID],
      [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (@BI_ResponsibleID = 0 OR [BI_ResponsibleID] = @BI_ResponsibleID)
  AND (@CategoryID = 0 OR [CategoryID] = @CategoryID)
  AND (@ChangeRequestorID = 0 OR [ChangeRequestorID] = @ChangeRequestorID)
0 голосов
/ 26 апреля 2018

Попробуйте что-то вроде этого:

ОБЪЯВИТЬ @BI_ResponsibleID INT, @CategoryID INT, @ChangeRequestorID INT

SET @BI_ResponsibleID = 5
SET @CategoryID = 3
SET @ChangeRequestorID = 4

SELECT TOP 4
     [BI_ResponsibleID],
     [CategoryID],
     [ChangeRequestorID]   
FROM [BI_Planning].[dbo].[tlbActivity]
WHERE (ISNULL([BI_ResponsibleID],0) = @BI_ResponsibleID) 
    AND (ISNULL([CategoryID],0) = @CategoryID)
    AND (ISNULL([ChangeRequestorID],0) = @ChangeRequestorID)
...