0

我有一个关于在 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
4

3 回答 3

4

您可以使用公用表表达式来添加列,以便稍后在查询中的多个位置使用它;

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;

...否则每次比较都会使用一个案例。

一个用于测试的 SQLfiddle

于 2013-05-16T18:05:30.867 回答
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')
于 2013-05-16T18:41:33.553 回答
1

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

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

于 2013-05-16T17:20:48.910 回答