Concatenação de string do SQL Server com nulo

86

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?

Alex
fonte
2
A resposta aceita estava certa no momento em que a pergunta foi feita, mas para todos no SQL Server 2012 e posterior (e nesse estágio que deve ser todos) @ a resposta de Martin-Smith é a melhor, pois lida com nulos automaticamente.
Dowlers de

Respostas:

144

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.

marc_s
fonte
23
"Coalesce" é o nome da função padrão ANSI, mas ISNULL é mais fácil de soletrar.
Philip Kelley
1
E ISNULL parece ser um pouco mais rápido no SQL Server também - então, se você quiser usá-lo em uma função que concatena strings em uma coluna computada, pode renunciar ao padrão ANSI e optar pela velocidade (consulte Adam Machanic: sqlblog.com / blogs / adam_machanic / archive / 2006/07/12 /… )
marc_s
Acabei de usar essa consulta Isnull (,), ela ajudou muito porque eu estava concatenando valores juntos e se um deles fosse nulo, tudo se tornaria nulo também.
Sizons
Usar ISNULL()é uma boa solução, mas do SQL Server 2012 em diante, você também pode usar a CONCATfunção para obter o mesmo resultado:CONCAT(@Column1, @Column2)
Muhammad Musavi
2
É importante notar aqui que se você quiser trocar nullpor algo diferente de uma string vazia, ou seja IsNull(@Column1, 'NULLVALUE'), com IsNulla string de substituição, o comprimento é limitado ao comprimento da coluna que está substituindo, enquanto não é porCoalesce
Jamie
59

No SQL Server 2012, tudo isso é muito mais fácil com a CONCATfunção.

Ele trata NULLcomo uma string vazia

DECLARE @Column1 VARCHAR(50) = 'Foo',
        @Column2 VARCHAR(50) = NULL,
        @Column3 VARCHAR(50) = 'Bar';


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/
Martin Smith
fonte
Para versões mais antigas, você obtém "'CONCAT' não é um nome de função integrada reconhecido", então use COALESCE
Savage
3
@Savage - COALESCE não funcionará porque não concatena, ele apenas retorna o primeiro argumento não nulo
codeulike
30

Use COALESCE . Em vez de your_columnusar COALESCE(your_column, ''). Isso retornará a string vazia em vez de NULL.

Mark Byers
fonte
OP quer concat strings, COALESCE não fará isso
codeulike
12

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.

Simran
fonte
11

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 
Eddie
fonte
8

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

Address1 , Address2 , Endereço3 , Cidade , Codigo postal

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!

ebooyens
fonte
Há vários colchetes aninhados redundantes que podem ser removidos. Outra dica é que você também pode remover a instrução case como se address1 fosse nulo, a expressão inteira será avaliada como nula (embora ter a instrução case chame a atenção de que isso pode acontecer)
Alternador
7

ISNULL(ColumnName, '')

Ian Jacobs
fonte
1

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.

BryDav
fonte
0

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+"')
Srinivasula Reddy
fonte
0

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'
Akmal Salikhov
fonte