2

我有一个简单的查询,如下所示:

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,组组合框将包含以下选项:

  • 全部
  • IT1
  • IT2

如果用户从第一个组合部门中选择然后分组,这很容易,因为我只检查组。
问题是当他想要来自 IT 部门的所有订单时。

这是将组分配给部门的方式

  • 它 - 1,2,5
  • 呼叫中心 - 4,6
  • 打印 - 3

有任何想法吗?

添加:

我创造了这样的东西:

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)

我不知道它是否正确,它以某种方式起作用:)

4

2 回答 2

1

这是查询。In the front end, when a single group is selected, you assign the @group variable, just like you did before. 如果没有选择单个组,则为部门分配标志。因此,如果选择了所有 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。

于 2012-04-19T09:32:32.400 回答
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)
于 2012-04-19T09:46:44.587 回答