如何在sql中重用case语句

时间:2013-05-16 17:16:57

标签: sql case

我有一个关于在sql中的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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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')

答案 2 :(得分:1)

如果您需要在存储过程中的多个位置使用此case表达式的输出值,那么绝对是。 (我们是在谈论SQL Server还是Oracle?)

不幸的是,如果您正在讨论尝试在SQL语句中的多个位置重用它,那么不,您不能使用T-SQL / P-SQL变量。要在SQL语句中的多个位置重用案例表达式值,您必须定义并创建一个输出该案例语句值的用户定义函数。