我有一个当前使用标量函数的proc,在select语句中两次,如下所述。当我们处理数百万条记录时,用内联函数替换它会更好。但是应该是什么呢?
CREATE FUNCTION getcategory
(
@shopping_store CHAR(4),
@cart_type CHAR(2),
@category_type INT,
@index_cat_type INT
)
RETURNS INT
BEGIN
IF @shopping_store IN ('1111','1222','3222') AND @cart_type in ('120')
RETURN -@category_type
ELSE IF @shopping_store IN ('4333','54322') AND @cart_type IN ('120')
RETURN @index_cat_type
ELSE
BEGIN
IF @shopping_store IN ('32214','5432','5654')
RETURN @category_type
ELSE
RETURN -@index_cat_type
END
RETURN @category_type
END
答案 0 :(得分:1)
所有这些IF ELSE都可以转换为单个案例表达式。然后,您可以将此标量函数转换为内联表值函数。当您声明有数百万行时,这应该是相当大的性能优势。我也冒昧地将@cart_type改为char(4),因为GarethD指出它甚至不能包含' 120'。当我想要一个负数时,我也使用了显式乘法,因为它太容易错过了 - 在开始时,当你乘以负数1时非常清楚。
CREATE FUNCTION getcategory
(
@shopping_store CHAR(4),
@cart_type CHAR(4),
@category_type INT,
@index_cat_type INT
)
RETURNS TABLE as RETURN
select case
when @shopping_store IN ('1111','1222','3222') AND @cart_type in ('120')
then -1 * @category_type
when @shopping_store IN ('4333','54322') AND @cart_type IN ('120')
then @index_cat_type
when @shopping_store IN ('32214','5432','5654')
then @category_type
ELSE
-1 * @index_cat_type
END as CategoryType