2010-05-10 62 views
1

我是一个SQL新手,我使用mssql2005加入条件取决于参数

我喜欢做输入参数加入动作depression。

CREATE PROCEDURE SelectPeriodicLargeCategoryData 
    @CATEGORY_LEVEL CHAR(1), 
    @CATEGORY_CODE VARCHAR(9) 
AS 

... 


JOIN CATEGORY_AD_SYS CAS WITH(NOLOCK) 
ON CA.CATEGORY_ID = [[[[[ HERE  ]]]] 

以上的sql。
如果@CATEGORY_LEVEL = 'L'话,我想加入上CAS.LCATEGORY

否则,如果@CATEGORY_LEVEL = 'M'话,我想加入上CAS.MCATEGORY

否则,如果@CATEGORY_LEVEL = 'S'话,我想加入上CAS.SCATEGORY

...

我怎样才能做到这一点?

回答

5

你可以使用一个CASE表达,如:

CASE @CATEGORY_LEVEL 
    WHEN 'L' THEN CAS.LCATEGORY 
    WHEN 'M' THEN CAS.MCATEGORY 
    WHEN 'S' THEN CAS.SCATEGORY 
END 

我不知道有多快,这将是一个JOINON条件(取决于查询优化器如何聪明是关于它的当然,所以你最好通过测量真实数据来检查) - 如果结果不可接受的性能,我想你可以使用完全不同的SELECT声明,这取决于@CATEGORY_LEVEL作为最后的手段。

2

如果将表格归一化为First Normal Form,这会更容易。现在您的不同类别列形成重复组

要完成此规范化,您需要另一张表来表示CASCA之间的多对多关系。

CREATE TABLE HasCategory (
    CATEGORY_ID INTEGER, 
    CAS_ID   INTEGER, 
    CATEGORY_LEVEL CHAR(1), -- 'L' or 'M' or 'S' 
    PRIMARY KEY (CATEGORY_ID, CAS_ID, CATEGORY_LEVEL), 
    FOREIGN KEY (CATEGORY_ID) REFERENCES CATEGORIES, 
    FOREIGN KEY (CAS_ID) REFERENCES CATEGORY_AD_SYS 
); 

然后,你可以写你的加入条件,以更直接的方式:

SELECT ... 
FROM CATEGORIES CA 
JOIN HasCategory H ON (H.CATEGORY_ID = CA.CATEGORY_ID) 
JOIN CATEGORY_AD_SYS CAS ON (H.CAS_ID = CAS.CAS_ID) 
WHERE H.CATEGORY_LEVEL = @CATEGORY_LEVEL 
1

如果你不能修复模式比尔Karwin说,然后用IF来切换查询。

使用CASE语句,将杀死性能(我假设你给在列的索引)

IF @CATEGORY_LEVEL = 'L' 
    SELECT 
    ... 
    JOIN CATEGORY_AD_SYS CAS WITH(NOLOCK) ON CA.CATEGORY_ID = CAS.LCATEGORY 

ELSE IF @CATEGORY_LEVEL = 'M' 
    SELECT 
    ... 
    JOIN CATEGORY_AD_SYS CAS WITH(NOLOCK) ON CA.CATEGORY_ID = CAS.MCATEGORY 

ELSE IF @CATEGORY_LEVEL = 'M' 
    SELECT 
    ... 
    JOIN CATEGORY_AD_SYS CAS WITH(NOLOCK) ON CA.CATEGORY_ID = CAS.SCATEGORY 
+0

SELECT语句很长..所以我只是想改变取决于输入参数 – 2010-05-10 07:36:45

+0

如果加盟条件它很长,那意味着CASE会表现得更差。它有3种不同的JOIN,所以它是3种不同的SELECT – gbn 2010-05-10 07:40:54