2013-05-16 65 views
0

我有一個關於在sql語句中重複使用下面的代碼的問題。 我不知道如果我可以聲明一個變量對於這一說法如何在sql中重用case語句

CASE 
    WHEN ssr.rating = 'A' OR ssr.rating LIKE 'A[+-]' 
    THEN 1 

    WHEN ssr.rating = 'AA' OR ssr.rating LIKE 'AA[+-]' 
    THEN 2 

    WHEN ssr.rating = 'BBB' OR ssr.rating LIKE 'BBB[+-]' 
    THEN 3 

    ELSE 0 
END 
+0

你真的不能聲明一個變量爲語句(或其中的一部分),除非您使用動態SQL。你可以添加一個查詢(以及是否使用MySQL/SQL Server/Oracle/...),並且可以簡化它。 –

回答

1

如果你需要一個存儲過程中多處這種情況下,表達的產值,那麼是的,絕對。 (我們在談論Sql Server還是Oracle?)

不幸的是,如果您正在討論試圖在SQL語句中的多個地方重新調用它,那麼不,您不能使用T-SQL/P-SQL變量。要在SQL狀態管理器中的多個位置重新使用一個case表達式值,您必須定義並創建一個用戶定義的函數來輸出該case語句值。

+0

我試圖在SQL服務器中重用它。除了創建用戶定義函數之外,還有其他更簡單的方法嗎? – user2391001

+0

@ user2391001您可以使用公用表表達式,但這取決於查詢。 –

3

您可以使用公用表表達式來添加列,以便稍後在多個位置的查詢中使用它;

WITH cte AS (
    SELECT *, 
    CASE 
    WHEN ssr.rating = 'A' OR ssr.rating LIKE 'A[+-]'  THEN 1 
    WHEN ssr.rating = 'AA' OR ssr.rating LIKE 'AA[+-]' THEN 2 
    WHEN ssr.rating = 'BBB' OR ssr.rating LIKE 'BBB[+-]' THEN 3 
    ELSE 0 
    END value 
    FROM ssr 
) 
SELECT * FROM cte; 

然後可以使用cte而不是ssr在查詢中,始終都值列添加,例如;

SELECT * 
FROM cte 
WHERE value=1 OR value=2; 

......否則它們會在每次比較時使用一個案例。

An SQLfiddle to test with

2

比UDF簡單嗎?我不知道你的意思,這是很簡單的......

CREATE FUNCTION RatingToNumber(@rating nvarchar(10)) RETURNS int AS 
BEGIN 
RETURN CASE 
    WHEN @rating = 'A' OR @rating LIKE 'A[+-]'  THEN 1 
    WHEN @rating = 'AA' OR @rating LIKE 'AA[+-]' THEN 2 
    WHEN @rating = 'BBB' OR @rating LIKE 'BBB[+-]' THEN 3 
    ELSE 0 
    END 
END 

然後你就可以像這樣使用它...

SELECT dbo.RatingToNumber('A')