首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle PL/SQL字符串比较问题

Oracle PL/SQL字符串比较问题
EN

Stack Overflow用户
提问于 2011-09-02 23:52:58
回答 6查看 110.7K关注 0票数 23

我有以下Oracle PL/SQL代码,从你们的角度来看,它们可能是生疏的:

代码语言:javascript
复制
 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是否有另一种常用方法来比较两个字符串?

EN

回答 6

Stack Overflow用户

发布于 2011-09-05 23:12:53

让我们通过在逻辑中添加其他分支来填补代码中的空白,看看会发生什么:

代码语言:javascript
复制
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。即使另一个字符串也是空的,也是如此。

票数 12
EN

Stack Overflow用户

发布于 2011-09-04 20:03:03

我使用=而不是<>来比较字符串。我发现在这种情况下,=似乎比<>以更合理的方式工作。我已经指定两个空(或NULL)字符串相等。实际的实现返回PL/SQL boolean,但这里我将其更改为pls_integer (0表示false,1表示true),以便能够轻松地演示该函数。

代码语言:javascript
复制
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;
/
票数 2
EN

Stack Overflow用户

发布于 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')的方法,因为您不能总是保证一个值不会出现……尤其是在数字方面。

我使用了以下几种方法:

代码语言:javascript
复制
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所示。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7286047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档