我有以下Oracle PL/SQL代码,从你们的角度来看,它们可能是生疏的:
DECLARE
str1 varchar2(4000);
str2 varchar2(4000);
BEGIN
str1:='';
str2:='sdd';
IF(str1<>str2) THEN
dbms_output.put_line('The two strings is not equal');
END IF;
END;
/
很明显,两个字符串str1和str2不相等,但是为什么没有打印出‘这两个字符串不相等’呢?Oracle是否有另一种常用方法来比较两个字符串?
发布于 2011-09-05 23:12:53
让我们通过在逻辑中添加其他分支来填补代码中的空白,看看会发生什么:
SQL> DECLARE
2 str1 varchar2(4000);
3 str2 varchar2(4000);
4 BEGIN
5 str1:='';
6 str2:='sdd';
7 IF(str1<>str2) THEN
8 dbms_output.put_line('The two strings is not equal');
9 ELSIF (str1=str2) THEN
10 dbms_output.put_line('The two strings are the same');
11 ELSE
12 dbms_output.put_line('Who knows?');
13 END IF;
14 END;
15 /
Who knows?
PL/SQL procedure successfully completed.
SQL>
所以这两个字符串既不相同也不相同?哈?
归根结底是这样的。Oracle将空字符串视为NULL。如果我们试图比较一个NULL和另一个字符串,结果既不是真也不是假,它就是NULL。即使另一个字符串也是空的,也是如此。
发布于 2011-09-04 20:03:03
我使用=
而不是<>
来比较字符串。我发现在这种情况下,=
似乎比<>
以更合理的方式工作。我已经指定两个空(或NULL)字符串相等。实际的实现返回PL/SQL boolean,但这里我将其更改为pls_integer (0表示false,1表示true),以便能够轻松地演示该函数。
create or replace function is_equal(a in varchar2, b in varchar2)
return pls_integer as
begin
if a is null and b is null then
return 1;
end if;
if a = b then
return 1;
end if;
return 0;
end;
/
show errors
begin
/* Prints 0 */
dbms_output.put_line(is_equal('AAA', 'BBB'));
dbms_output.put_line(is_equal('AAA', null));
dbms_output.put_line(is_equal(null, 'BBB'));
dbms_output.put_line(is_equal('AAA', ''));
dbms_output.put_line(is_equal('', 'BBB'));
/* Prints 1 */
dbms_output.put_line(is_equal(null, null));
dbms_output.put_line(is_equal(null, ''));
dbms_output.put_line(is_equal('', ''));
dbms_output.put_line(is_equal('AAA', 'AAA'));
end;
/
发布于 2016-01-29 18:27:15
为了解决核心问题,“当这两个变量中的一个为空时,我应该如何检测它们不具有相同的值?”,我不喜欢nvl(my_column, 'some value that will never, ever, ever appear in the data and I can be absolutely sure of that')
的方法,因为您不能总是保证一个值不会出现……尤其是在数字方面。
我使用了以下几种方法:
if (str1 is null) <> (str2 is null) or str1 <> str2 then
dbms_output.put_line('not equal');
end if;
免责声明:我不是Oracle巫师,这是我自己想出来的,在其他地方也没有见过,所以可能有一些微妙的原因来解释为什么这是一个糟糕的想法。但它确实避免了APC提到的陷阱,即将NULL与其他事物进行比较,得出的结果既不是真也不是假,而是null。因为子句(str1 is null)
总是返回TRUE或FALSE,而不是null。
(请注意,PL/SQL执行短路评估,如here所示。)
https://stackoverflow.com/questions/7286047
复制相似问题