sql >> Base de Datos >  >> RDS >> Mysql

4 formas de reemplazar NULL con un valor diferente en MySQL

En MySQL, a veces no desea que los valores NULL se devuelvan como NULL . A veces desea que los valores NULL se devuelvan con un valor diferente, como "N/A", "No aplicable", "Ninguno" o incluso la cadena vacía "".

Afortunadamente, hay varias formas de hacer esto en MySQL.

Aquí hay cuatro:

  • El IFNULL() función
  • El COALESCE() función
  • El IF() función combinada con IS NULL (o IS NOT NULL ) operador
  • El CASE expresión combinada con IS NULL (o IS NOT NULL ) operador

A continuación se muestran ejemplos de estas opciones.

Datos de muestra

Primero, tomemos algunos datos de muestra:

USE Solutions;
SELECT TaskCode
From Tasks;

Resultado:

+----------+
| TaskCode |
+----------+
| gar123   |
| NULL     |
| NULL     |
| dog456   |
| NULL     |
| cat789   |
+----------+

Así que tenemos tres valores NULL y tres valores no NULL.

Función IFNULL()

Dado su nombre, esta es probablemente la opción más obvia para reemplazar valores NULL en MySQL. Esta función es básicamente el equivalente de ISNULL() en SQL Server.

El IFNULL() función le permite proporcionar dos argumentos. El primer argumento se devuelve solo si no es NULL. Si es NULL, en su lugar se devuelve el segundo argumento.

Aquí hay un ejemplo del uso de IFNULL() contra nuestro conjunto de datos de muestra:

SELECT IFNULL(TaskCode, 'N/A') AS Result 
FROM Tasks;

Resultado:

+--------+
| Result |
+--------+
| gar123 |
| N/A    |
| N/A    |
| dog456 |
| N/A    |
| cat789 |
+--------+

Aquí, simplemente reemplazamos los valores NULL con N/A .

Función COALESCE()

Esta función es similar a IFNULL() función, pero ligeramente diferente. Esta función se adhiere al estándar ANSI  SQL y se implementa ampliamente en varios RDBMS.

La forma en que funciona es que proporciona tantos argumentos como necesite. COALESCE() luego devolverá el primer no NULL valor en la lista, o NULL si no hay ningún NULL valores.

Así:

SELECT COALESCE(TaskCode, 'N/A') AS Result 
FROM Tasks;

Resultado:

+--------+
| Result |
+--------+
| gar123 |
| N/A    |
| N/A    |
| dog456 |
| N/A    |
| cat789 |
+--------+

Entonces obtenemos exactamente el mismo resultado que antes.

Sin embargo, la diferencia con esta función es que, como se mencionó, puede proporcionar una lista de argumentos. El COALESCE() la función tomará el que sea el primer valor no NULL.

Entonces, por ejemplo, podríamos agregar NULL como primer argumento y coloque None antes de N/A y mira lo que pasa:

SELECT COALESCE(NULL, TaskCode, 'None', 'N/A') AS Result 
FROM Tasks;

Resultado:

+--------+
| Result |
+--------+
| gar123 |
| None   |
| None   |
| dog456 |
| None   |
| cat789 |
+--------+

Se saltó el primer NULL como se esperaba, luego omitió cualquier valor NULL en el TaskCode columna, antes de decidirse por None . El N/A el valor no se usó en este caso porque None vino primero y es un valor no NULL.

La función IF() combinada con IS NULL/IS NOT NULL

El IS NULL y IS NOT NULL Los operadores le permiten probar valores NULOS y presentar un valor diferente según el resultado.

Podemos usar estos operadores dentro del IF() función, de modo que se devuelvan valores no NULL y los valores NULL se reemplacen con un valor de nuestra elección.

Ejemplo:

SELECT IF(TaskCode IS NOT NULL, TaskCode, 'N/A') AS Result 
FROM Tasks;

Resultado:

+--------+
| Result |
+--------+
| gar123 |
| N/A    |
| N/A    |
| dog456 |
| N/A    |
| cat789 |
+--------+

Así que el mismo resultado que con IFNULL() y COALESCE() funciones.

Y, por supuesto, podríamos intercambiar IS NOT NULL con IS NULL . Si hacemos eso, también tendríamos que intercambiar los argumentos subsiguientes:

SELECT IF(TaskCode IS NULL, 'N/A', TaskCode) AS Result 
FROM Tasks;

La expresión CASE combinada con IS NULL/IS NOT NULL

Otra forma de hacerlo es usar el CASE expresión:

SELECT 
    CASE 
        WHEN TaskCode IS NOT NULL THEN TaskCode 
        ELSE 'N/A' 
    END AS Result
FROM Tasks;

Resultado:

+--------+
| Result |
+--------+
| gar123 |
| N/A    |
| N/A    |
| dog456 |
| N/A    |
| cat789 |
+--------+

Al igual que con el ejemplo anterior, esto podría reescribirse para usar IS NULL en lugar de IS NOT NULL :

SELECT 
    CASE 
        WHEN TaskCode IS NULL THEN 'N/A' 
        ELSE TaskCode 
    END AS Result
FROM Tasks;