PostgreSQL存在于用户定义函数中,始终返回true
我编写了一个简单的用户定义函数来检查是否存在符合某些条件的行:PostgreSQL存在于用户定义函数中,始终返回true,sql,postgresql,naming-conventions,function-parameter,Sql,Postgresql,Naming Conventions,Function Parameter,我编写了一个简单的用户定义函数来检查是否存在符合某些条件的行: CREATE OR REPLACE FUNCTION is_instructor_specialized_in(eid INT, course_area VARCHAR(50)) RETURNS BOOLEAN AS $$ SELECT EXISTS(SELECT 1 FROM Specializes s WHERE s.eid = eid AND s.name = course_area); $$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION is_instructor_specialized_in(eid INT, course_area VARCHAR(50))
RETURNS BOOLEAN AS $$
SELECT EXISTS(SELECT 1 FROM Specializes s WHERE s.eid = eid AND s.name = course_area);
$$ LANGUAGE sql;
我使用以下查询对其进行了测试:
SELECT is_instructor_specialized_in(2, 'Artificial Intelligence') as function_output,
EXISTS(SELECT 1 FROM Specializes s WHERE s.eid = 2 AND s.name = 'Artificial Intelligence') as ground_truth;
当函数的计算结果为false时,函数给出了错误的true值。表中没有这样的行:
事实上,它总是给出true的值。我非常困惑。发生这种情况有什么原因吗
版本:x86_64-apple-darwin19.6.0上的PostgreSQL 13.2,由apple clang Version 11.0.3 clang-1103.0.32.62编译,64位与@wildplasser暗示的一样,您的函数参数具有与表列相同的名称,这绝不是一个好主意。在这种情况下,它会悄悄地破坏您的功能 其中s.eid=eid中的非限定eid解析为表列,而不是函数参数,正如您所期望的那样。因此,对于任何notnull输入,该谓词的计算结果为true。鬼鬼祟祟的错误 如果参数名称与当前SQL中的任何列名相同 命令,列名称将优先。到 重写此项,用函数名限定参数名 它本身就是函数名。参数名。如果这会 与限定列名冲突,列名再次获胜。你 可以通过为表选择不同的别名来避免歧义 在SQL命令中 我的 使用函数名进行限定是一种很难的最后手段。避免从明确的参数名称开始出现问题。一种约定是在参数前面加下划线u-,并且对表列不做相同的操作: 创建或替换函数func_property_eid int,_course_area text 返回布尔值 语言sql稳定并行安全AS $func$ 选择Exists从s中选择,其中s.eid=\U eid和s.name=\U course\U区域; $func$; 或者对像您这样的简单情况使用位置$n参数引用。对于文档和命名函数调用,仍然可以使用参数名: 创建或替换函数func_property_eid int,_course_area text 返回布尔值 语言sql稳定并行安全AS $func$ 选择EXISTSSELECT FROM s,其中s.eid=$1和s.name=$2; $func$; 小提琴 另外,PL/pgSQL函数中相同命名冲突的默认行为是引发异常。请参阅:
嗯,这也是我所期望的,但不知怎的,我得到了错误的值。不知道这是否与我使用的pgAdmin 4.WHERE s.eid=eid的程序有关