将MySQL判断元组存在的函数转换为PostgreSQL等价实现求助
问题描述
现有一段可在MySQL中正常运行的函数,用于判断client表中是否存在指定手机号的记录,并返回布尔值。需将其转换为PostgreSQL版本,但自行编写的代码存在语法错误,寻求等价实现方案。
原MySQL代码:
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//
尝试的PostgreSQL代码(存在语法错误):
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;
等价PostgreSQL实现方案
方案一:PL/pgSQL实现(贴近原MySQL逻辑)
修复语法错误并符合PostgreSQL规范的版本:
CREATE OR REPLACE 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;
方案二:精简SQL函数实现
PostgreSQL支持直接用SQL编写简单函数,无需PL/pgSQL,代码更简洁:
CREATE OR REPLACE FUNCTION searchUser(inPhone VARCHAR(13)) RETURNS BOOLEAN AS $$ SELECT EXISTS(SELECT 1 FROM client WHERE phone = inPhone); $$ LANGUAGE sql;
原尝试代码的错误说明
- 缺少
RETURNS子句:PostgreSQL函数必须明确指定返回类型 - 函数体包裹错误:PostgreSQL的PL/pgSQL函数需要用
AS $$ ... $$包裹函数体,而非直接写BEGIN - CASE语句未闭合:PL/pgSQL中CASE结构必须用
END CASE完成闭合 - 返回值类型错误:原代码返回字符串'1'/'0',但PostgreSQL的BOOLEAN类型应使用
TRUE/FALSE,或直接返回EXISTS的结果(EXISTS本身返回布尔值)
内容的提问来源于stack exchange,提问作者Ariel
相关产品推荐
相关产品推荐

