我正在尝试在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
但是我收到此错误,我也不知道为什么:
在需要条件的上下文中指定的非布尔类型的表达式
答案 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()函数