2012-04-19 67 views
2

我有一个简单的查询,像这样:TSQL 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) 

我Orders表列组,但没有列的部门。

情况如下: 我有2个组合框。一个用于部门,另一个用于小组。 在首先我必须选择:

  • 所有
  • IT
  • CALL CENTER

当用户选择COMBO1东西二是填充。 如果他选择IT组组合框将有选择:

  • 所有
  • IT1
  • IT2

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

下面是组是如何分配到各部门

  • IT - 1,2,5
  • CALL CENTER - 4,6
  • PRINT - 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) 

我不知道这是否是corrent,它在某种程度上工程:)

+1

你能改变表格模式吗? – 2012-04-19 09:33:17

+0

不幸的是:/ – Misiu 2012-04-19 09:36:46

+0

SQL查询是在哪里定义和执行的? (这是一个.net程序吗?) – 2012-04-19 09:37:58

回答

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) 
+0

你第二次节省我的一天:)我马上检查一下。你的解决方案看起来非常顺利,易于实现:)我会马上检查它。 – Misiu 2012-04-19 09:53:47

+0

这个工作得很好:)但我应该再次使用我的问题或这个问题的解决方案吗?我的订单表中有大约500k条记录。 – Misiu 2012-04-19 10:02:00

+0

@米苏我没有测试就说不出来。你能用两种不同的参数来计算两种解决方案吗 – 2012-04-19 10:06:11

1

下面是该查询。在前端,当选择一个组时,您可以像以前一样分配@group变量。如果未选择单个组,则为该部门分配标志。所以,如果所有的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 。

+0

但我的桌子上没有专栏部门。我知道IT部门有1,2,5组。但数据库中没有任何信息:/我无法更改 – Misiu 2012-04-19 09:33:53

+0

您可以从前端的组合框中抓取部门吗?所以如果IT被选中,你提供@ department ='IT'和@ group = NULL – Eugene 2012-04-19 09:40:25