Una consulta SQL que reemplaza valores nulos.
Pregunta
Necesito una consulta SQL que devuelva ContactDate, SortName, City, ContactType y Summary de las tablas a continuación. Si algún valor es nulo, lo necesito para devolver el texto "Sin entrada".
ContactTable
- ContactID
- Fecha de contacto
- ID de usuario
- Resumen
- ContactType
- SortName
UserTable
- UsuarioID
- Nombre
- Apellido
- AddressID
AddressTable
- AddressID
- ciudad
- calle
- estado
- Zip
Solución
SELECT COALESCE(CAST(CONVERT(VARCHAR(10), ContactTable.ContactDate, 101) AS VARCHAR(10)), 'No Entry') AS ContactDate,
COALESCE(ContactTable.SortName, 'No Entry') AS SortName,
COALESCE(AddressTable.City, 'No Entry') AS City,
COALESCE(ContactTable.ContactType, 'No Entry') AS ContactType
FROM ContactTable
LEFT OUTER JOIN UserTable ON ContactTable.UserID = UserTable.UserID
LEFT OUTER JOIN AddressTable ON UserTable.AddressID = AddressTable.AddressID
Aquí es un gráfico de los formatos de fecha y hora de SQL para la declaración CONVERT anterior.
Otros consejos
COALESCE () en cualquier plataforma que valga su peso en sal.
Asegúrate de manejar los problemas de casting.
Por ejemplo:
--(SQL Server)
SELECT
C.ContactID,
COALESCE(CAST(CONVERT(varchar(10), C.ContactDate, 101) AS varchar(10), 'No Entry') AS ContactDate,
COALESCE(SorName, 'No Entry') AS SortName
etc., etc.
SELECT
ISNULL(ContactDate, 'No Entry') AS ContactDate
FROM Table
Usar ISNULL es bastante simple.
La versión de Oracle de esta función se llama nvl
. Mismo uso - SELECT nvl (col_name, desired_value) FROM foo
.
La versión más general de esto es decode
, que tiene tres parámetros y le permite especificar qué valor de columna desea reemplazar (para que pueda reemplazar todos 'Johnny' con 'John' 'o algo).
El uso de ' IIF ' es una solución de Access DB pero puede funcionar en otros DBs.
SELECT IIF(IsNull(Foo), 'No Entry' ,Foo), IIF(IsNull(Bar), 'No Entry' ,Bar) From TableName
La función IIF devuelve uno de los 2 valores dependiendo de la evaluación de una expresión.
Sintaxis SQL:
IIF (expresión, true-value1, false-value)
También puedes hacer diferentes llamadas para cada columna. Tomará más llamadas individuales, pero puede ser más rápido si no tiene muchas filas para actualizar.
update ContactTable set ContactDate = 'No Entry' where ContactDate is null;
Repita para cada columna.