parametros - procedimientos y funciones oracle pl/sql
Oracle/PL SQL/SQL comparación nula en donde cláusula (8)
Solo una pregunta sobre el trato anulará los valores en una consulta.
Por ejemplo tengo la siguiente tabla con los siguientes campos y valores
TABLEX
Column1
1
2
3
4
5
---------
Column2
null
A
B
C
null
Estoy pasando una variableY en un procedimiento específico. Dentro del procedimiento hay un cursor como este.
CURSOR c_results IS
SELECT * FROM TABLEX where column2 = variableY
ahora el problema es variableY puede ser nulo, A, B o C si la variableY es nulo, quiero seleccionar todo el registro donde column2 es nulo, de lo contrario donde column2 es A, B o C.
No puedo hacer el cursor / consulta anterior porque si la variable Y es nula no funcionará porque la comparación debería ser
CURSOR c_results IS
SELECT * FROM TABLEX where column2 IS NULL
¿Qué cursor / consulta debo usar para acomodar una variable de cadena o nula?
Lo siento si mi pregunta es un poco confusa. No soy tan bueno explicando cosas. Gracias por adelantado.
A continuación es similar a la respuesta "top" pero más concisa:
WHERE ((column2 = variableY ) or COALESCE( column2, variableY) IS NULL)
El Ask de Tom de Oracle dice:
where decode( col1, col2, 1, 0 ) = 0 -- finds differences
o
where decode( col1, col2, 1, 0 ) = 1 -- finds sameness - even if both NULL
Intenta usar la función ISNULL()
puede verificar si la variable es nula y, de ser así, establecer un valor de retorno predeterminado. camparing null to null no es realmente posible. recuerda: nulo <> nulo
Podrías usar DUMP
:
SELECT *
FROM TABLEX
WHERE DUMP(column2) = DUMP(variableY);
Advertencia: Esta no es una expresión capaz de SARG, por lo que no habrá uso del índice.
Con este enfoque, no necesita buscar un valor que no exista en sus datos (como NVL/COALESCE
).
Podrías usar algo como:
SELECT * FROM TABLEX WHERE COALESCE(column2, '''') = COALESCE(variableY, '''')
(COALESCE toma el primer valor no NULL)
Tenga en cuenta que esto solo funcionará cuando el contenido de la columna no pueda ser '''' (cadena vacía). De lo contrario, esta declaración fallará porque NULL coincidirá con '''' (cadena vacía).
(editar) También podrías considerar:
SELECT * FROM TABLEX WHERE COALESCE(column2, ''a string that never occurs'') = COALESCE(variableY, ''a string that never occurs'')
Esto solucionará la hipótesis de fallo.
Puede producir un SQL diferente dependiendo del contenido de ese parámetro, o alterar su SQL de esta manera:
WHERE (column2 = variableY) OR (variableY IS NULL AND column2 IS NULL)
Puede que no sea apropiado dependiendo de los datos que está viendo, pero un truco que he visto (y he usado) es comparar NVL (nombre de campo, valor somenonexistent).
Por ejemplo, si AGE es una columna opcional, podría usar:
if nvl(table1.AGE,-1) = nvl(table2.AGE,-1)
Esto depende de que haya un valor que nunca se permitirá. La edad es un buen ejemplo, salario, números de secuencia y otros valores numéricos que no pueden ser negativos. Las cadenas pueden ser más complicadas, por supuesto, puedes decir que nunca tendrás a nadie llamado ''xyzzymaryhadalittlelamb "o algo así, ¡pero el día que corres con la suposición de que SABES que contratarán a alguien con ese nombre!
Todo lo que dice: "donde a = b o (a es nulo y b es nulo)" es la forma tradicional de resolverlo. Lo que es desafortunado, ya que incluso los programadores experimentados a veces se olvidan de eso.
WHERE variableY is null or column2 = variableY
for example:
create table t_abc (
id number(19) not null,
name varchar(20)
);
insert into t_abc(id, name) values (1, ''name'');
insert into t_abc(id, name) values (2, null);
commit;
select * from t_abc where null is null or name = null;
--get all records
select * from t_abc where ''name'' is null or name = ''name'';
--get one record with name = ''name''