Postgres plpgsql存储函数中的文本相等(包括空值)

gre*_*alu 4 sql postgresql null equals plpgsql

我有一个存储函数,它应该比较三个文本值是否相等.其中一些文本值可能为null,如果是,则比较应返回false值.

CREATE OR REPLACE FUNCTION "subject_check_if_subjectName_exists"(name1IN text, name2IN text, name3IN text, name4IN text)
returns boolean as
$$
declare
    results boolean;
    subjectList record;
begin
    results = false;
    for subjectList in select name1, name2, name3, name4 from subject loop
    if (name1In = subjectList.name1) and (name2In = subjectList.name2) and (name3In = subjectList.name3) and (name4In = subjectList.name4)
      then
        results = true;
        EXIT; -- exit out of loop
    end if;
    end loop;
    return results;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

name4IN和subjectList.name4都是null,并且所有其他值都相等,该函数不返回true值 - 它应该是.即使它们为null,我如何比较这些文本值(null = null应该返回true)?

mu *_*ort 6

我想你想用is not distinct from:

对于非空输入,IS DISTINCT FROM<>运算符相同.但是,如果两个输入都为null,则返回false,如果只有一个输入为null,则返回true.类似地,IS NOT DISTINCT FROM=非null输入相同,但是当两个输入都为null时返回true,而当只有一个输入为null时返回false.

从本质上讲,它就A is not distinct from B像是A = B将NULL视为"相等"(即它的行为与大多数SQL新手认为=应该的一样).例如,考虑一个这样的简单函数:

create function f(text,text) returns text as $$
begin
    if $1 is distinct from $2 then
        return '!=';
    end if;
    return '==';
end $$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

这会给你这样的结果:

=> select f(null, null) as "1"
          f(null, '') as "2",
          f('', '') as "3",
          f('pancakes','pancakes') as "4",
          f('pancakes', null) as "5",
          f('pancakes', 'house') as "6";
 1  | 2  | 3  | 4  | 5  | 6  
----+----+----+----+----+----
 == | != | == | == | != | !=
Run Code Online (Sandbox Code Playgroud)

所以这就是你要找的东西:

if (name1In is not distinct from subjectList.name1) and ...
Run Code Online (Sandbox Code Playgroud)