coalesce mysql para que sirve
¿Cuál es la diferencia entre ifnull y coalesce en mysql? (5)
Pros de COALESCE
COALESCEes una función estándar de SQL .Mientras que
IFNULLes específico de MySQL y su equivalente en MSSQL (ISNULL) es específico de MSSQL.COALESCEpuede funcionar con dos o más argumentos (de hecho, puede funcionar con un solo argumento, pero es bastante inútil en este caso:COALESCE(a)≡a).Mientras que
IFNULLde MySQL yIFNULLMSSQL son versiones limitadas deCOALESCEque pueden funcionar solo con dos argumentos.
Contras de COALESCE
Según la documentación de Transact SQL ,
COALESCEes solo unCOALESCEsintaxis paraCASEy puede evaluar sus argumentos más de una vez . Más detalladamente:COALESCE(a1, a2, …, aN)≡CASE WHEN (a1 IS NOT NULL) THEN a1 WHEN (a2 IS NOT NULL) THEN a2 ELSE aN END. Esto reduce en gran medida la utilidad deCOALESCEen MSSQL.Por otro lado,
ISNULLen MSSQL es una función normal y nunca evalúa sus argumentos más de una vez.COALESCEen MySQL y PostgreSQL no evalúa sus argumentos más de una vez.En este punto del tiempo, no sé exactamente cómo los estándares de SQL definen
COALESCE.Como vemos en el punto anterior, las implementaciones reales en RDBMS varían: algunas (por ejemplo, MSSQL) hacen que
COALESCEevalúe sus argumentos más de una vez, algunas (p. Ej., MySQL, PostgreSQL): no.c-treeACE, que afirma que su implementación
COALESCEes compatible con SQL-92 , dice: "Esta función no está permitida en una cláusula GROUP BY. Los argumentos para esta función no pueden ser expresiones de consulta". No sé si estas restricciones están realmente dentro del estándar SQL; la mayoría de las implementaciones actuales deCOALESCE(por ejemplo, MySQL, PostgreSQL) no tienen tales restricciones.IFNULL/ISNULL, como funciones normales, tampoco tienen tales restricciones.
Currículum
A menos que enfrente restricciones específicas de COALESCE en RDBMS específicos, le recomendaría usar siempre COALESCE como más estándar y más genérico.
Las excepciones son:
- Expresiones calculadas largas o expresiones con efectos secundarios en MSSQL (como, por documentación,
COALESCE(expr1, …)puede evaluarexpr1dos veces). - Uso dentro de
GROUP BYo con expresiones de consulta en c-treeACE. - Etc.
select ifnull(null,''replaces the null'')
-->replaces the null
select coalesce(null,null,''replaces the null'')
-->replaces the null
En ambas cláusulas, la diferencia principal es el argumento que pasa. Para ifnull son dos parámetros y se ifnull 2 o 3, podemos pasar, excepto que ¿tenemos alguna otra diferencia entre estos dos? Y cómo difiere en MSSql.
Diferencias en SQL-Server :
No hay función
IFNULL()peroISNULL()similarISNULL()ISNULLtoma solo 2 parámetros mientras que COALESCE toma un número variable de parámetrosCOALESCEse basa en el estándar ANSI SQL mientras queISNULLes una función TSQL patentadaLas validaciones para
ISNULLyCOALESCEtambién son diferentes. Por ejemplo, el valorNULLparaISNULLse convierte a int, mientras que paraCOAELSCEdebe proporcionar un tipo. Ex:ISNULL(NULL,NULL): es int.COALESCE(NULL,NULL): lanzará un error.COALESCE(CAST(NULL as int),NULL): es válido y devuelve int.
Determinación del tipo de datos de la expresión resultante:
ISNULLutiliza el primer tipo de parámetro,COALESCEsigue las reglas de expresiónCASEy devuelve el tipo de valor con mayor precedencia.
Este db2 SQL no funcionará con COALESE, no veré ninguna fila recuperada. Como utilicé IFNULL, funciona como se esperaba
select a.mbitno ,a.mbstqt,ifnull(b.apr,0)
from
(
select mmstcd,mbstat,mbfaci,mbwhlo,mbitno,mbstqt,MBALQT from libl.mitbal inner join libl.mitmas on
mmcono=mbcono and mmitno=mbitno
where mbcono=200 and mbstat in (''20'',''50'') and mmstcd>0
)
as a left join
(
select mlfaci,mlwhlo,mlitno,mlstas,sum(mlstqt) as APR from libl.mitloc where mlcono=200 and mlstas=''2''
group by mlfaci,mlwhlo,mlitno,mlstas
)
b on b.mlfaci=a.mbfaci and b.mlwhlo=a.mbwhlo and b.mlitno=a.mbitno
where a.mbitno in ''GWF0240XPEC'' and a.mbstqt>0 and a.mbstqt<>ifnull(b.apr,0)
La principal diferencia entre los dos es que la función IFNULL toma dos argumentos y devuelve el primero si no es NULL o el segundo si el primero es NULL .
COALESCE función COALESCE puede tomar dos o más parámetros y devuelve el primer parámetro que no sea NULL, o NULL si todos los parámetros son nulos, por ejemplo:
SELECT IFNULL(''some value'', ''some other value'');
-> returns ''some value''
SELECT IFNULL(NULL,''some other value'');
-> returns ''some other value''
SELECT COALESCE(NULL, ''some other value'');
-> returns ''some other value'' - equivalent of the IFNULL function
SELECT COALESCE(NULL, ''some value'', ''some other value'');
-> returns ''some value''
SELECT COALESCE(NULL, NULL, NULL, NULL, ''first non-null value'');
-> returns ''first non-null value''
ACTUALIZACIÓN: MSSQL hace un tipo más estricto y la comprobación de parámetros. Además, no tiene la función IFNULL sino la función ISNULL , que necesita conocer los tipos de argumentos. Por lo tanto:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
También la función COALESCE en MSSQL requiere que al menos un parámetro sea no nulo, por lo tanto:
SELECT COALESCE(NULL, NULL, NULL, NULL, NULL);
-> results in an error
SELECT COALESCE(NULL, NULL, NULL, NULL, ''first non-null value'');
-> returns ''first non-null value''
ifnull solo puede reemplazar un valor nulo del primer parámetro. Mientras que coalesce puede reemplazar cualquier valor con otro valor. Con la coalesce en SQL estándar, puede tener muchos parámetros que transforman muchos valores.
EDITA el ejemplo de acuerdo a los comentarios a continuación.
Ejemplo: coalesce(null, null, null, ''b*'', null, ''null*'') devuelve ''b *'' y no es posible hacer con ifnull .