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)
.
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 atext
[...]
Ê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.
character(n)
char(n)
text
ou varchar
. Detalhes:
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;
É 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
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.Tenta isto
select textcat(textcat(FirstName,' '),LastName) AS Name from person;
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!!!
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;