instrucciones guion expresion cualquier contrario comodin caracter bajo string oracle oracle11g compare case-statement

string - guion - like sql php



Secuencia de comparaciĆ³n de SQL (3)

Además de la solución de Frank Schmitt , lea sobre este tema en este foro aquí:

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

Otra opción para evitar el problema no es utilizar un predicado de comparación, sino alguna otra función que realice comparaciones, por ejemplo, DECODE() , que no coacciona los tipos de datos:

SELECT CASE WHEN decode('' 1a'', '' 1a '', 1, 0) = 1 THEN ''EQUAL - but it isn´t- HELP!!!!'' ELSE ''UNEQUAL'' END FROM DUAL;

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

¿Puede alguien ayudarme y explicarme por qué los DB dicen que estas 2 cuerdas son las mismas?

'' 1a'' = '' 1a ''

Ya probé muchas declaraciones pero no puedo averiguar por qué. Busqué también en la especificación de Oracle 11g pero no hay nada explicado así.


Para obtener más información, puede consultar la documentación aquí , que dice: "Dentro de las expresiones y condiciones, Oracle trata los literales de texto como si tuvieran el tipo de datos CHAR comparándolos mediante una semántica de comparación acolchada en blanco", y aquí para obtener detalles en blanco acolchado semántica de comparación.


Porque Oracle convierte su literal de cadena en un CHAR; dado que CHAR es de longitud fija, tiene que expandir la cadena más corta a la longitud correcta y, por lo tanto, agrega espacios. Pruebe VARCHAR2 en su lugar:

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;

EDIT: ejemplo para ilustrar la diferencia entre CHAR (10) y 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;