2013-05-16 68 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')