postgresql 返回true或false是否存在postgres元组

cwtwac6a  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(169)

我试图实现一个代码写在mysql到postgres返回真或假存在的元组,然而,我还没有能够做到这一点成功。
现在的代码是在mysql中没有问题的代码,但是,我想在postgress中运行它。如何实现等价性

CREATE FUNCTION searchUser(inPhone VARCHAR(13)) 
RETURNS bool
BEGIN
 
   RETURN (CASE WHEN EXISTS(
        SELECT 1   
        FROM client   
        WHERE phone=inPhone)
        THEN 1 ELSE 0 END );

 END//

我已经尝试在postgres中这样做,但它不工作,抛出sitaxix错误

CREATE FUNCTION searchUser(inPhone VARCHAR(13))  
BEGIN
RETURN CASE WHEN EXISTS
    (SELECT 1 FROM client WHERE  phone=inPhone) 
    THEN '1' 
    ELSE '0';
END;
$$ LANGUAGE plpgsql;
gcuhipw9

gcuhipw91#

对于这样一个简单的函数,你不需要plpgsql。SQL足够好,速度更快,并且可以由计划器优化。

CREATE OR REPLACE FUNCTION searchUser(inPhone VARCHAR(13))
RETURNS bool
LANGUAGE sql
AS
$$
    SELECT count(*) >= 1 -- will always return TRUE or FALSE
    FROM client
    WHERE phone = $1;
$$;

或者就像@Bergi问的那样,使用EXISTS:

CREATE OR REPLACE FUNCTION searchuser(inphone VARCHAR(13))
    RETURNS BOOL
    LANGUAGE sql
AS
$$
    SELECT EXISTS(SELECT 1 FROM client WHERE phone = $1);
$$;

再次使用SQL语言

2vuwiymt

2vuwiymt2#

您也可以使用Postgres返回BOOLEAN

CREATE FUNCTION searchUser(inPhone VARCHAR(13)) RETURNS BOOLEAN  
AS $$
BEGIN
RETURN CASE WHEN EXISTS
    (SELECT 1 FROM client WHERE  phone=inPhone) 
    THEN TRUE
    ELSE FALSE
  END;
END;
$$ LANGUAGE plpgsql;

测试结果:

Table "public.client"
 Column | Type | Collation | Nullable | Default 
--------+------+-----------+----------+---------
 phone  | text |           |          | 

postgres=# select * from client;
 phone 
-------
 foo
(1 row)

postgres=# select * from searchUser('foo');
 searchuser 
------------
 t
(1 row)

postgres=# select * from searchUser('bar');
 searchuser 
------------
 f
(1 row)

您甚至可以通过以下方式进一步简化该功能:

postgres=# CREATE FUNCTION searchUser(inPhone VARCHAR(13)) RETURNS BOOLEAN  
AS $$
BEGIN
RETURN EXISTS (SELECT 1 FROM client WHERE  phone=inPhone) ;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# select * from searchUser('foo');
 searchuser 
------------
 t
(1 row)

postgres=# select * from searchUser('bar');
 searchuser 
------------
 f
(1 row)
cigdeys3

cigdeys33#

你可以这样做:

CREATE OR REPLACE FUNCTION searchUser(inPhone VARCHAR(13)) 
RETURNS BOOLEAN AS $$
BEGIN
   RETURN (EXISTS (SELECT 1 FROM client WHERE phone = inPhone));
END;
$$ LANGUAGE plpgsql;

fiddle demo

相关问题