Ошибка использования не булева типа в случае, когда оператор в SQL Server - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь написать функцию в 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 ]

2 голосов
/ 11 апреля 2019

В вашем коде несколько ошибок. Я предполагаю, что у вас есть 2 столбца в вашей таблице instal_app с именами 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

Как уже упоминал Шон, это можно легко преобразовать в встроенную табличную функцию для значительного повышения производительности.

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;
0 голосов
/ 11 апреля 2019

Попробуйте это:

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

Если вы знаете, что может быть только 1 запись (или 0), вы можете удалить функцию sign ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...