Como concatenar as colunas numa selecção de Postgres?

tenho duas colunas de cordas a e b numa tabela foo.

select a, b from foo devolve os valores a e b. No entanto, a concatenação de a e b não funciona. Eu tentei.

select a || b from foo

e

select  a||', '||b from foo

actualização a partir dos comentários: ambas as colunas são tipo character(2).

Author: Erwin Brandstetter, 2013-11-13

7 answers

Com tipo string colunas como character(2) (como você mencionou mais tarde), o concatenação só funciona porque, citando o manual:

[...] o operador de concatenação de texto (||) aceita o Não-texto entrada, desde que pelo menos uma entrada seja de um tipo de cadeia , como mostrado em quadro 9, 8 . Para outros casos, inserir uma coerção explícita a text [...]

Ênfase ousada minha. O segundo exemplo (select a||', '||b from foo funciona para qualquer tipo de dados, dado que o texto literal não tipado ', ' é por omissão do tipo text tornando a expressão inteira válida em qualquer caso.

Para tipos de dados não-string, você pode "corrigir" a primeira declaração por casting pelo menos um argumento para text. (qualquer tipo pode ser moldado para text):

SELECT a::text || b AS ab FROM foo;

A julgar por a tua própria resposta, "does not work "was supposed to mean" returns NULL ". O resultado de qualquer coisa concatenada a NULL é nula. Se NULO valores podem estar envolvidos e o resultado não deve ser NULO, o uso concat_ws() para concatenar qualquer número de valores (Postgres 9.1 ou posterior):

SELECT concat_ws(', ', a, b) AS ab FROM foo;

Ou concat() se não precisar de separadores:

SELECT concat(a, b) AS ab FROM foo;

Não há necessidade de moldes de tipo aqui, uma vez que ambas as funções tomam "any" entrada e trabalho com representações de texto.

Mais detalhes (e por que COALESCE é um substituto pobre) neste relacionado resposta:

Quanto à actualização no comentário

+ is not a valid operator for string concatenation in Postgres (or the SQL standard). É uma ideia privada da Microsoft adicionar isto aos seus produtos.

Não há quase nenhuma razão para usar character(n) (sinónimo: char(n)). Utilização text ou varchar. Detalhes:
 187
Author: Erwin Brandstetter, 2018-06-28 01:55:49

O problema estava em nulls nos valores; então a concatenação não funciona com nulls. A solução é a seguinte:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;
 19
Author: Alex, 2015-07-20 22:44:04

É melhor usar a função CONCAT no PostgreSQL para a concatenação

Eg : select CONCAT(first_name,last_name) from person where pid = 136

Se estiver a usar column_a | | '' / column_b para concatenação para 2 coluna , se algum dos valores em column_a ou column_b for null query irá devolver o valor nulo. o que pode não ser preferido em todos os casos.. então, em vez disto

||

Utilizar

CONCAT

Devolve o valor relevante se algum deles tiver valor

 14
Author: arjun nagathankandy, 2014-06-09 09:36:14

As funções CONCAT por vezes não funcionam com a versão postgreSQL mais antiga

Veja o que usei para resolver o problema sem usar CONCAT

 u.first_name || ' ' || u.last_name as user,

Ou também pode utilizar

 "first_name" || ' ' || "last_name" as user,

No segundo caso, usei aspas duplas para o primeiro nome e o último nome

Espero que isto seja útil, obrigado.
 3
Author: Rameshwar Vyevhare, 2014-12-09 06:47:40

Tenta isto

select textcat(textcat(FirstName,' '),LastName) AS Name from person;
 0
Author: Muhammad Sadiq, 2015-11-13 10:14:43

A estrutura Laravel do PHP, estou a usar o primeiro nome da pesquisa, os campos do último nome consideram como a Pesquisa por Nome Completo

Usando / / símbolo ou métodos concat_ws(), concat ()

$names = str_replace(" ", "", $searchKey);                               
$customers = Customer::where('organization_id',$this->user->organization_id)
             ->where(function ($q) use ($searchKey, $names) {
                 $q->orWhere('phone_number', 'ilike', "%{$searchKey}%"); 
                 $q->orWhere('email', 'ilike', "%{$searchKey}%");
                 $q->orWhereRaw('(first_name || last_name) LIKE ? ', '%' . $names. '%');
    })->orderBy('created_at','desc')->paginate(20);
Isto funcionou!!!
 0
Author: venkatSkpi, 2018-06-25 08:17:47

Por exemplo, se existir um quadro de empregados constituído por colunas como:

employee_number,f_name,l_name,email_id,phone_number 

Se quisermos concatenar {[[2]} como name.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;
 -3
Author: Abhishek Mitra, 2018-03-13 15:30:15