在SQL Server中的when语句中使用非布尔类型时出错

时间:2019-04-11 18:27:23

标签: sql-server function

我正在尝试在SQL Server中编写一个函数,该函数检查表中是否存在一个元组。如果是这样,它将返回1,否则应返回0

这是我写的:

create function allow_user_to_score
    (@user_id char(6), @app_id char(7))
returns smallint
as 
begin
    declare @result

    select @result = case 
                        when (@user_id, @app_id) in (select * from installed_app) 
                           then 1 
                           else 0
    from installed_app

    return (@result)
end

但是我收到此错误,我也不知道为什么:

  

在需要条件的上下文中指定的非布尔类型的表达式

2 个答案:

答案 0 :(得分:2)

您的代码有多个错误。我假设您的install_app表中有2列,分别为user_id和app_id。

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS SMALLINT
AS 
BEGIN
    DECLARE @result smallint;

    SELECT @result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;
    RETURN @result;
END

如Sean所述,可以轻松地将其转换为内联表值函数,以极大地提高性能。

CREATE FUNCTION allow_user_to_score(
    @user_id char(6), 
    @app_id char(7)
)
RETURNS TABLE
AS RETURN
    SELECT result = CASE WHEN EXISTS (SELECT * 
                                        FROM installed_app 
                                        WHERE user_id = @user_id 
                                        AND app_id = @app_id) 
                            THEN 1 
                            ELSE 0 END;

答案 1 :(得分:0)

尝试一下:

   declare @result smallint
    select @result = sign(count(*)) from installed_app 
                     where userId=@userId and appId=@appId
    return (@result)

如果您知道只能有1条记录(或0条记录),则可以删除sign()函数