Pergunta

Eu tenho uma tabela com três campos, nome, sobrenome e e-mail.

Eis alguns dados fictícios:

FirstName | LastName | Email
Adam        West       adam@west.com
Joe         Schmoe     NULL

Agora, se eu faço:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS

Sinais vitais para Joe é nulo, pois não existe um único campo nulo. Como você supera esse comportamento? Além disso, este é o comportamento padrão no MS SQL Server?

Foi útil?

Solução

Tente

ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL

Assim,

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL

voltaria a mesma coisa sem a emissão nula (e uma cadeia em branco onde nulos deve ser).

Outras dicas

Olhe para CONCAT_WS

Por exemplo:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")

Os rendimentos

TEST STRINGTEST STRING 2

Isto é mais fácil do que construir IFNULL em torno de tudo. Você pode usar uma seqüência vazia como separador.

Em mysql isnull vai trabalhar algum tempo. tente IFNULL (),

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS

é recomendado, mas se você está realmente viciado em CONCAT, envolvê-la em {fn} e você pode usar a função ODBC como:

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS

Se você precisa primeiro último mas apenas passado, quando primeiro é nula você pode fazer isso:

ISNULL(FirstName+' ','') + ISNULL(LastName,'')

Eu adicionei o espaço no primeiro nome que pode ser nulo - isso significaria que o espaço só iria sobreviver se FirstName tinha um valor

.

Para colocá-los todos juntos com um espaço entre cada:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))

Você sempre pode usar a configuração CONCAT_NULL_YIELDS_NULL ..

SET CONCAT_NULL_YIELDS_NULL OFF apenas correr e, em seguida, todos os encadeamentos null resultará em texto e não nulo ..

A resposta de Stefan está correto. Para sondar um pouco mais profundo que você precisa saber que NULL não é o mesmo que nada. Nulo representa a ausência de um valor, ou em outras palavras, não definido. Nada representa uma cadeia vazia que na verdade é um valor.

Undefined + qualquer coisa = undefined

Boa banco de dados petisco para agarrar!

Se você receber (como eu faço no MySQL):

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

Você pode substituir a função ISNULL por COALESCE:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))

A partir MS SQL Server 2012 foi introduzido função CONCAT e acordo com MSDN

Os valores nulos são implicitamente convertido para uma cadeia vazia. Se todo o argumentos são nulos, uma cadeia vazia do tipo varchar (1) é retornado.

por isso é o suficiente para usar CONCAT sem IsNull

CONCAT(FirstName, LastName, Email)

SQL Server não tem uma função CONCAT.
(Update: A partir do MS SQL Server 2012 foi introduzido CONCAT função )

No comportamento padrão SQL Server, nulos se propagam através de uma expressão.

No SQL Server, pode-se escrever:

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

Se você precisar NULLs punho:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS

No caso do MS Access

Opção 1) SELECT (nome + "" + LastName + "" + E-mail) como Vitals dos membros Você vai ter resultado em branco no caso de qualquer campo com null.

Opção 2) SELECT (nome & "" & LastName & "" &-mail) como Vitals dos membros Você vai ter espaço no lugar do campo com null.

Depois de observar as respostas para esta pergunta, você pode combinar todas elas em uma solução simples

CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))

Então , em CONCAT_WS uso que curto para concatenar os nossos campos e separá-los com ,; e aviso que os campos NULL nem EMPTY não vai concatenado

NULLIF irá verificar se o campo é NULL ou EMPTY, um campo que contém apenas espaços ou está vazio, bem como, ex: '', ' ') ea saída será ou NULL ou NOT NULL

IF Será posto para fora do campo se não é NULL ou EMPTY

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top