7
CASE 
WHEN ' 1a' = ' 1a                 '
THEN 'EQUAL - but it isn´t- HELP!!!!' ELSE 'UNEQUAL'
END                     
from dual;

任何人都可以帮助我,向我解释为什么数据库说这两个字符串是相同的

' 1a' = ' 1a                 '

我已经尝试了很多陈述,但我找不到原因。我也在 Oracle 11g 的规范中进行了搜索,但没有这样的解释。

4

3 回答 3

6

因为 Oracle 将您的字符串文字转换为 CHAR;由于 CHAR 是固定长度的,它必须将较短的字符串扩展为正确的长度,因此会添加空格。尝试 VARCHAR2 代替:

SELECT
  CASE 
  WHEN cast(' 1a' as varchar2(100)) = cast(' 1a                 ' as varchar2(100))
  THEN 'EQUAL - but it isn´t- HELP!!!!' ELSE 'UNEQUAL'
  END                     
from dual;

编辑:示例说明 CHAR(10) 和 VARCHAR2(10) 之间的区别

declare
  l_char1 char(10) := '1';
  l_char2 char(10) := '1    ';
  l_varchar1 varchar2(10) := '1';
  l_varchar2 varchar2(10) := '1    ';
begin
  if l_char1 = l_char2 then     
    dbms_output.put_line('char equal');
  else
    dbms_output.put_line('char NOT equal');
  end if;  
  if l_varchar1 = l_varchar2 then 
    dbms_output.put_line('varchar equal');
  else
    dbms_output.put_line('varchar NOT equal');
  end if;
end;  
于 2012-08-21T13:20:47.230 回答
0

除了弗兰克施密特的解决方案,请在此论坛帖子中阅读有关此问题的信息:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:59852033114407

解决此问题的另一种选择是不使用比较谓词,而是使用其他一些执行比较的函数,例如DECODE(),它不强制数据类型:

SELECT
  CASE 
  WHEN decode(' 1a', ' 1a                 ', 1, 0) = 1
  THEN 'EQUAL - but it isn´t- HELP!!!!' ELSE 'UNEQUAL'
  END                     
FROM DUAL;
于 2012-08-21T13:21:48.197 回答
0

有关更多信息,您可以参考此处的文档,其中说:“在表达式和条件中,Oracle 通过使用空白填充的比较语义来比较文本文字,就好像它们具有数据类型 CHAR”,以及此处的空白填充的详细信息比较语义。

于 2012-08-21T13:32:19.497 回答