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;