我正在尝试使用 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
数据类型。由于EXISTS
return是布尔值,所以不用测试,直接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(功能有所不同);
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
数据类型。由于EXISTS
return是布尔值,所以不用测试,直接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(功能有所不同);