2010-05-10 64 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