我有一个关于在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
答案 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;
......否则将使用案例进行每次比较。
答案 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语句中的多个位置重用案例表达式值,您必须定义并创建一个输出该案例语句值的用户定义函数。