Afirmação 1
O operador de concatenação ||
pode concatenar qualquer valor do tipo string, retornando text
. No Postgres, cada tipo tem uma representação de texto e pode ser convertido em text
. Consequentemente, citando o manual :
No entanto, o operador de concatenação de strings (
||
) ainda aceita entradas que não sejam strings, desde que pelo menos uma entrada seja do tipo string
Relacionado:
Afirmação 2
Concatenar um ou mais NULL
valores torna o resultado NULL
.
test=# SELECT (text 'foo' || NULL) IS NULL
test-# , (text 'bar' || char '1' || NULL ) IS NULL
test-# , (NULL::bigint || text 'baz') IS NULL;
?column? | ?column? | ?column?
----------+----------+----------
t | t | t
Pergunta
É possível concatenar a text
e um NULL
valor e obter um resultado não nulo?
Em outras palavras, como isso é possível?
test=# SELECT col IS NULL AS col_is_null
test-# , (text 'foo' || col) IS NULL AS result_is_null
test-# FROM tbl;
col_is_null | result_is_null
-------------+----------------
t | f
Aplica-se a qualquer versão do Postgres.
Um cliente meu tropeçou nisso, confiando no resultado como NULL
, e achei intrigante o suficiente para compartilhar.
É uma pergunta um pouco complicada, pois eu sei a resposta.
Nota: CASE
ou COALESCE
capturar NULL
valores normalmente é um bom estilo, mas não é disso que trata esta pergunta. Trata-se de concatenação com um NULL
valor real, com o operador de concatenação ||
e ainda obtendo um resultado não nulo.
Isso porque o sistema de CASTing de tipos de array no PostgreSQL é um pouco estranho (à primeira vista) :-)
text || text[]
faz ambos os lados coagidos a matrizes.Outro exemplo que pode esclarecer mais:
Question Is it possible to concatenate a text and a NULL value and get a non-null result?
Responda, sim!
Usando
CASE
instruções aninhadas (com agradecimentos a Craig Ringer ):Consulta:
Resultado (o
'*_
e'_*'
são para tornar mais aparente o que está acontecendo!):