salida procedimientos procedimiento parametros funciones entrada ejecutar con almacenado sql oracle plsql null

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)



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);

Demostración de DBFiddle

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''