Estoy creando una columna calculada en campos de los cuales algunos son potencialmente nulos.
El problema es que si alguno de esos campos es nulo, toda la columna calculada será nula. Entiendo por la documentación de Microsoft que esto se espera y se puede desactivar mediante la configuración SET CONCAT_NULL_YIELDS_NULL. Sin embargo, no quiero cambiar este comportamiento predeterminado porque no conozco sus implicaciones en otras partes de SQL Server.
¿Hay alguna forma de que pueda verificar si una columna es nula y solo agregar su contenido dentro de la fórmula de columna calculada si no es nula?
Respuestas:
Puedes usar
ISNULL(....)
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
Si el valor de la columna / expresión es de hecho NULL, se utilizará en su lugar el segundo valor especificado (aquí: cadena vacía).
fuente
ISNULL()
es una buena solución, pero a partir de SQL Server 2012 en adelante, también puede usar laCONCAT
función para obtener el mismo resultado:CONCAT(@Column1, @Column2)
null
por algo que no sea una cadena vacía, es decirIsNull(@Column1, 'NULLVALUE')
, conIsNull
la longitud de la cadena de reemplazo se limita a la longitud de la columna que está reemplazando, mientras que no lo estáCoalesce
Desde SQL Server 2012, todo esto es mucho más fácil con la
CONCAT
función.Se trata
NULL
como una cadena vacíaDECLARE @Column1 VARCHAR(50) = 'Foo', @Column2 VARCHAR(50) = NULL, @Column3 VARCHAR(50) = 'Bar'; SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
fuente
Utilice COALESCE . En lugar de
your_column
usarCOALESCE(your_column, '')
. Esto devolverá la cadena vacía en lugar de NULL.fuente
Utilizar
SET CONCAT_NULL_YIELDS_NULL OFF
y la concatenación de valores nulos en una cadena no dará como resultado un valor nulo.
Tenga en cuenta que esta es una opción obsoleta, evite usar. Consulte la documentación para obtener más detalles.
fuente
También puede usar CASE: mi código a continuación verifica tanto valores nulos como cadenas vacías, y agrega un separador solo si hay un valor a seguir:
SELECT OrganisationName, 'Address' = CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END FROM Organisations
fuente
Solo quería contribuir con esto si alguien estuviera buscando ayuda para agregar separadores entre las cadenas, dependiendo de si un campo es NULL o no.
Entonces, en el ejemplo de creación de una dirección de una línea a partir de campos separados
en mi caso, tengo la siguiente columna calculada que parece estar funcionando como quiero:
case when [Address1] IS NOT NULL then ((( [Address1] + isnull(', '+[Address2],'')) + isnull(', '+[Address3],'')) + isnull(', '+[City] ,'')) + isnull(', '+[PostCode],'') end
¡Espero que ayude a alguien!
fuente
ISNULL(ColumnName, '')
fuente
También tuve muchos problemas con esto. No pude hacerlo funcionar usando los ejemplos de casos anteriores, pero esto hace el trabajo por mí:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') + ' ' + ISNULL(House_no, '') + ' ' + ISNULL(Street, '') + ' ' + ISNULL(Town, '') + ' ' + ISNULL(City, ''))),' ',' ')
Reemplazar corrige los espacios dobles causados por la concatenación de espacios simples sin nada entre ellos. r / ltrim elimina los espacios en los extremos.
fuente
En el servidor SQL:
insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]') PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL.
Código detrás:
string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'"; string email = txtEmail.Text; insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
fuente
Este ejemplo le ayudará a manejar varios tipos mientras crea declaraciones de inserción
select 'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 'values(' + '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date + '''' + Str+ ''',' -- string + '''' + convert(nvarchar(50), Code) + ''',' -- int + convert(nvarchar(50), Price) + ',' -- decimal + '''' + ISNULL(Tag, '''''') + '''' + ')' -- nullable string from doc where CDate> '2019-01-01 00:00:00.000'
fuente