Estou criando uma coluna computada em campos dos quais alguns são potencialmente nulos.
O problema é que se algum desses campos for nulo, toda a coluna computada será nula. Entendo pela documentação da Microsoft que isso é esperado e pode ser desativado por meio da configuração SET CONCAT_NULL_YIELDS_NULL. No entanto, não quero alterar esse comportamento padrão porque não sei suas implicações em outras partes do SQL Server.
Existe uma maneira de apenas verificar se uma coluna é nula e apenas acrescentar seu conteúdo na fórmula da coluna calculada se não for nula?
Respostas:
Você pode usar
ISNULL(....)
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
Se o valor da coluna / expressão for de fato NULL, o segundo valor especificado (aqui: string vazia) será usado.
fonte
ISNULL()
é uma boa solução, mas do SQL Server 2012 em diante, você também pode usar aCONCAT
função para obter o mesmo resultado:CONCAT(@Column1, @Column2)
null
por algo diferente de uma string vazia, ou sejaIsNull(@Column1, 'NULLVALUE')
, comIsNull
a string de substituição, o comprimento é limitado ao comprimento da coluna que está substituindo, enquanto não é porCoalesce
No SQL Server 2012, tudo isso é muito mais fácil com a
CONCAT
função.Ele trata
NULL
como uma string vaziaDECLARE @Column1 VARCHAR(50) = 'Foo', @Column2 VARCHAR(50) = NULL, @Column3 VARCHAR(50) = 'Bar'; SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
fonte
Use COALESCE . Em vez de
your_column
usarCOALESCE(your_column, '')
. Isso retornará a string vazia em vez de NULL.fonte
Usar
SET CONCAT_NULL_YIELDS_NULL OFF
e a concatenação de valores nulos em uma string não resultará em nulo.
Observe que esta é uma opção obsoleta, evite usar. Veja a documentação para mais detalhes.
fonte
Você também pode usar CASE - meu código abaixo verifica os valores nulos e strings vazias e adiciona um separador apenas se houver um 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
fonte
Eu só queria contribuir com isso, caso alguém esteja procurando ajuda para adicionar separadores entre as strings, dependendo se um campo é NULL ou não.
Portanto, no exemplo de criação de um endereço de uma linha a partir de campos separados
no meu caso, tenho a seguinte Coluna Calculada que parece estar funcionando como desejo:
case when [Address1] IS NOT NULL then ((( [Address1] + isnull(', '+[Address2],'')) + isnull(', '+[Address3],'')) + isnull(', '+[City] ,'')) + isnull(', '+[PostCode],'') end
Espero que ajude alguém!
fonte
ISNULL(ColumnName, '')
fonte
Eu também tive muitos problemas com isso. Não foi possível fazê-lo funcionar usando os exemplos de caso acima, mas isso faz o trabalho para mim:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') + ' ' + ISNULL(House_no, '') + ' ' + ISNULL(Street, '') + ' ' + ISNULL(Town, '') + ' ' + ISNULL(City, ''))),' ',' ')
Substituir corrige os espaços duplos causados pela concatenação de espaços simples sem nada entre eles. r / ltrim remove todos os espaços nas extremidades.
fonte
No Sql Server:
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 por trás:
string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'"; string email = txtEmail.Text; insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"')
fonte
Este exemplo irá ajudá-lo a lidar com vários tipos ao criar instruções de inserção
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'
fonte