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)?
我想你想用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)
| 归档时间: |
|
| 查看次数: |
4286 次 |
| 最近记录: |