SQL比较字符串

Max*_*ler 7 string oracle compare case-statement oracle11g

CASE 
WHEN ' 1a' = ' 1a                 '
THEN 'EQUAL - but it isn´t- HELP!!!!' ELSE 'UNEQUAL'
END                     
from dual;
Run Code Online (Sandbox Code Playgroud)

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

' 1a' = ' 1a                 '
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*itt 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;
Run Code Online (Sandbox Code Playgroud)

编辑:示例说明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;  
Run Code Online (Sandbox Code Playgroud)

  • 这里是指定两个字符串字面量将默认,使用`CHAR`比较语义http://docs.oracle.com/cd/B14117_01/server.101/b10759/sql_elements002比较的数据类型比较规则的链接. htm"只有当比较中的两个值都是数据类型CHAR,NCHAR,文本文字或USER函数返回的值的表达式时,Oracle才使用空白填充比较语义." (4认同)