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

DBがこれら2つの文字列が同じであると言う理由を説明してください。

' 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 に答える