我正在尝试使用 postgresql 创建检查登录过程,如果密码已经存在,那么它应该 return 1 else 0. SQL 查询如下

I'm trying to create check login procedure with postgresql where if the password already exist then it should return 1 else 0. SQL query as follow

CREATE FUNCTION checkUsername (Iusername VARCHAR(50), Iuserpassword VARCHAR(50), result INT=0)
RETURNS VARCHAR(50) AS $$
BEGIN 
    SET nocount ON;
        IF EXISTS (SELECT * FROM users WHERE username=Iusername AND userpassword=Iuserpassword)
            SET result = 1
        ELSE 
            SET result = 0
    
        END IF;
END;$$LANGUAGE plpgsql;

除了缺少 plpgsql 函数所需的 return 语句,并且没有 set 语句,您的函数还有其他错误 and/or 明显的误解。首先,不需要声明形式参数的大小,它只是被忽略并被丢弃。说到参数,为什么要提供整数类型的 return 参数 (result),然后将函数定义为 return 和 varchar。最后是 IF 和赋值语句的问题。 True 分支需要 THEN 关键字,then/else 分支中的每个语句都需要语句终止符 (;)。更正每个代码变为:

create or replace
function checkusername (
         iusername varchar 
       , iuserpassword varchar
       , result varchar default '0')     -- type and value to match returns declaration 
  returns varchar      
as $$
begin 
    if exists (select * 
                 from users where username=iusername 
                  and userpassword=iuserpassword
              )
    then                                    -- added 
        result = '1';                       -- added  's and ;
    else 
        result = '0';                       -- added  's and ;                                           
    end if;
    
    return result;                          -- added 
end;  
$$ language plpgsql;

但是,这可以大大减少。 Postgres 完全支持 BOOLEAN 数据类型。由于EXISTSreturn是布尔值,所以不用测试,直接return其结果即可。这也允许 SQL 函数(1 条语句):

create or replace 
function checkusername (
         iusername varchar
       , iuserpassword varchar
       )  
 returns boolean
 language sql
as $$
    select exists (select null 
                     from users 
                    where username=iusername 
                      and userpassword=iuserpassword
                  ); 
$$;   

参见 demo(功能有所不同);