¿Existen diferencias no obvias entre NVL y Coalesce en Oracle?
Las diferencias obvias son que la fusión devolverá el primer elemento no nulo en su lista de parámetros, mientras que nvl solo toma dos parámetros y devuelve el primero si no es nulo; de lo contrario, devuelve el segundo.
Parece que NVL puede ser solo una versión de 'Base Case' de fusión.
¿Me estoy perdiendo de algo?
Respuestas:
COALESCE
Es una función más moderna que forma parte delANSI-92
estándar.NVL
esOracle
específico, se introdujo en80
's antes de que hubiera estándares.En el caso de dos valores, son sinónimos.
Sin embargo, se implementan de manera diferente.
NVL
siempre evalúa ambos argumentos, mientras queCOALESCE
generalmente detiene la evaluación cada vez que encuentra el primer noNULL
(hay algunas excepciones, como la secuenciaNEXTVAL
):Esto se ejecuta durante casi
0.5
segundos, ya que generaSYS_GUID()
's', a pesar de1
no ser unNULL
.Esto comprende que
1
no es unNULL
y no evalúa el segundo argumento.SYS_GUID
No se generan y la consulta es instantánea.fuente
NVL realizará una conversión implícita al tipo de datos del primer parámetro, por lo que lo siguiente no da error
COALESCE espera tipos de datos consistentes.
arrojará un 'error de tipo de datos inconsistente'
fuente
NVL y COALESCE se utilizan para lograr la misma funcionalidad de proporcionar un valor predeterminado en caso de que la columna devuelva un NULL.
Las diferencias son:
Ejemplos para el tercer caso. Otros casos son simples.
select nvl('abc',10) from dual;
funcionaría ya que NVL hará una conversión implícita de 10 numérico a cadena.select coalesce('abc',10) from dual;
fallará con Error - tipos de datos inconsistentes: CHAR esperado obtuvo NUMBEREjemplo para el caso de uso de UNION
falla con
ORA-00932: inconsistent datatypes: expected CHAR got DATE
tiene éxito
Más información: http://www.plsqlinformation.com/2016/04/difference-between-nvl-and-coalesce-in-oracle.html
fuente
También hay diferencia en el manejo del plan.
Oracle puede formar un plan optimizado con concatenación de filtros de rama cuando la búsqueda contiene una comparación de
nvl
resultados con una columna indexada.nvl:
juntarse:
Los créditos van a http://www.xt-r.com/2012/03/nvl-coalesce-concatenation.html .
fuente
Otra prueba de que coalesce () no detiene la evaluación con el primer valor no nulo:
Ejecute esto, luego verifique
my_sequence.currval;
fuente
En realidad no puedo aceptar cada declaración.
"COALESCE espera que todos los argumentos sean del mismo tipo de datos".
Esto está mal, ver abajo. Los argumentos pueden ser diferentes tipos de datos, eso también está documentado : si todas las apariciones de expr son tipos de datos numéricos o cualquier tipo de datos no numéricos que pueden convertirse implícitamente en un tipo de datos numéricos, Oracle Database determina el argumento con la mayor prioridad numérica, implícitamente convierte los argumentos restantes a ese tipo de datos y devuelve ese tipo de datos. . En realidad, esto está en contradicción con la expresión común "COALESCE se detiene en la primera aparición de un valor no nulo", de lo contrario, el caso de prueba No. 4 no debería generar un error.
También de acuerdo con el caso de prueba No. 5
COALESCE
realiza una conversión implícita de argumentos.fuente
Aunque este es obvio, e incluso mencionado de una manera presentada por Tom, quien hizo esta pregunta. Pero vamos a aguantar de nuevo.
NVL solo puede tener 2 argumentos. La fusión puede tener más de 2.
select nvl('','',1) from dual;
// Resultado::ORA-00909
número inválido de argumentosselect coalesce('','','1') from dual;
// Salida: devuelve 1fuente
NVL: Reemplace el nulo con valor.
COALESCE: Devuelve la primera expresión no nula de la lista de expresiones.
Tabla: PRICE_LIST
A continuación se muestra el ejemplo de
[1] Establecer el precio de venta al agregar un 10% de ganancia a todos los productos.
[2] Si no hay un precio de lista de compra, el precio de venta es el precio mínimo. Para liquidación de venta.
[3] Si tampoco hay un precio mínimo, establezca el precio de venta como precio predeterminado "50".
Explicar con un ejemplo práctico de la vida real.
Puede ver que con NVL podemos lograr las reglas [1], [2]
Pero con COALSECE podemos lograr las tres reglas.
fuente
NVL(Purchase_Price + (Purchase_Price * 0.10), nvl(Min_Price,50))
. O sobre:nvl(NVL(Purchase_Price + (Purchase_Price * 0.10), Min_Price) ,50)
:)