/ / TSQL 2 parametry opcjonalne - tsql, sql-server-2005, parametry opcjonalne

Parametry opcjonalne TSQL 2 - tsql, sql-server-2005, opcjonalne parametry

Mam takie proste zapytanie:

SELECT * FROM orders

który zwraca wszystkie zamówienia, proste.

Chciałbym dodać opcjonalne parametry do mojego zapytania.

DECLARE @group INT;
SET @group = 1 --IT1

SELECT * FROM orders WHERE group = isnull(@group, group)

To też działa dobrze.

Mój problem polega na tym, że potrzebuję drugiego parametru, takiego jak:

DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = "IT"

SELECT * FROM orders WHERE /*and here add limitation with department*/ group = isnull(@group, group)

Moja tabela zamówień ma kolumnę GROUP, ale nie ma kolumny DEPARTMENT.

Sytuacja wygląda tak: Mam 2 kombinatory. Jeden dla działów, drugi dla grupy. Najpierw mam opcje:

  • Wszystko
  • TO
  • CALL CENTER

Drugi jest wypełniany, gdy użytkownik wybierze coś z combo1. Jeśli wybierze IT, w polu kombi grupy będą dostępne opcje:

  • Wszystko
  • IT1
  • IT2

Jeśli użytkownik wybierze z pierwszego działu kombinacji, a następnie zgrupuje, jest to łatwe, ponieważ wtedy sprawdzam tylko grupę.
Problem polega na tym, że chce wszystkich zamówień z działu IT.

Oto, w jaki sposób grupy są przypisywane do działów

  • IT - 1,2,5
  • CALL CENTER - 4,6
  • DRUKUJ - 3

Jakieś pomysły?

DODANY:

Stworzyłem coś takiego:

DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = "IT"

SELECT * FROM orders WHERE
(@department IS NULL OR (@department="IT" AND group IN (1,2,5)) OR (@department="PRINT" AND group =3))
AND
(@group IS NULL OR group = @group)

Nie wiem czy to jest corrent, to jakoś działa :)

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz udawać, że masz tabelę, używając CTE wypełnionego rekordami za pośrednictwem union all. Następnie wykonaj połączenie i sprawdzenie. Jeśli wolisz, CTE może zostać zastąpione tabelą pochodną.

; WITH departments (DepartmentID, GroupID) as (
select "IT", 1
union all
select "IT", 2
union all
select "IT", 5
union all
select "CALL CENTRE", 4
union all
select "CALL CENTRE", 6
union all
select "PRINT", 3
)
SELECT *
FROM orders
INNER JOIN departments
ON orders.[group] = departments.GroupID
WHERE (@Group is null OR [group] = @group)
AND (@department is null OR DepartmentID = @department)

1 dla odpowiedzi nr 2

Oto zapytanie. W interfejsie, gdy wybrana jest jedna grupa, przypisujesz zmienną @group, tak jak wcześniej. Jeśli nie wybrano żadnej pojedynczej grupy, przypisujesz flagę dla działu. Więc jeśli wszystkie IT zostało wybrane, ustaw @allIT na 1 (lub cokolwiek, o ile nie ma wartości NULL) i postępuj w ten sposób:

SELECT * FROM orders
WHERE (@group = NULL OR group = @group)
AND
(@allIT = NULL OR group = 1 or group = 2 or group = 3)
AND
(@allCallCenter = NULL OR group = 4 or group = 5)
...

Jeśli w polu combobox nic nie jest zaznaczone, ustaw wartość tego parametru na NULL.