我有一个简单的查询:
SELECT * FROM orders
返回所有订单,简单。
我想在查询中添加可选参数。
DECLARE @group INT;
SET @group = 1 --IT1
SELECT * FROM orders WHERE group = isnull(@group, group)
这也可以。
我的问题是我需要第二个参数:
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)
我的订单表有列GROUP,但没有列DEPARTMENT。
情况看起来像这样: 我有2个组合框。一个用于部门,第二个用于组。 首先,我有选择:
当用户从combo1中选择某些内容时,将填充第二个。 如果他选择IT,则组合框将有选项:
如果用户从第一个组合部门中选择然后分组很容易,因为我只检查组 问题是当他想要部门IT的所有订单时。
以下是如何将组分配给部门
有什么想法吗?
增加:
我创造了类似的东西:
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)
我不知道它是否是正确的,它以某种方式起作用:)
答案 0 :(得分:1)
这是查询。在前端,当选择单个组时,您可以像以前一样分配@group变量。如果未选择任何一个组,则为department分配标志。因此,如果选择了所有IT,则将@allIT设置为1(或者其他任何内容,只要它不是NULL)并按以下步骤操作:
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)
...
如果在组合框中未选择任何内容,请将该参数值设置为NULL。
答案 1 :(得分:1)
你可以假装你有一张桌子,使用CTE通过union all填充记录。然后执行连接和检查。如果您愿意,CTE可能会被派生表替换。
; 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)