Postgres SELECT sütunları nasıl birleştirilir?


145

İki dize sütun ave bbir tablo var foo.

select a, b from foodeğerleri ave döndürür b. Ancak, birleştirme ave bçalışmaz. Denedim :

select a || b from foo

ve

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

Yorumlardan güncelleme: her iki sütun da türdür character(2).


... ya da başka bir texttip?
PM 77-1

@acfrancis OP dediğinden beri concatenate, PostgreSQL'in bazılarıyla da ilgilenmesine rağmen sayısal türlerle uğraştığından şüpheliyim. Buraya bakın: postgresql.org/docs/9.1/static/functions-string.html
PM 77-1

Evet, bu sütunlar karakter (2). "+" çalışmıyor - "Belirtilen ad ve bağımsız değişken türleriyle hiçbir işleç eşleşmiyor. Açık tür ifadeleri eklemeniz gerekebilir."
Alex

Hangi PostgreSQL sürümü var? 9.1 için dokümanlar: postgresql.org/docs/9.1/static/functions-string.html . Örneğime
PM 77-1 13:13

Muhtemelen sorgunuzda birleştirme ile ilgili olmayan bir sözdizimi hatası var.
PM 77-1 13:13

Yanıtlar:


260

İle dize türü gibi sütunlarda character(2)(daha sonra belirtildiği gibi), görüntülenen birleştirme sadece çünkü işleri manuel alıntı:

[...] dize birleştirme operatörü ( ||) , Tablo 9.8'de gösterildiği gibi en az bir girdi bir dize türünde olduğu sürece dize dışı girişi kabul eder . Diğer durumlar için, [...]text

Cesur vurgu benim. İkinci örnek ( select a||', '||b from foo) herhangi bir veri türü için çalışır, çünkü türlenmemiş dize değişmez değeri ', 'varsayılan olarak texttüm ifadeyi geçerli kılmak için yazmayı varsayılan olarak kullanır .

Dize olmayan veri türleri için, en az bir bağımsız değişken yayınlayarak 1. ifadeyi "düzeltebilirsiniz" text. ( Herhangi bir tür dökülebilir text):

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

Kendi cevabınızdan yola çıkarak " işe yaramaz " ifadesinin " NULL döndürmesi " anlamına gelmesi gerekiyordu . NULL ile bitiştirilen herhangi bir şeyin sonucu NULL olur. Eğer NULL değerler dahil olabilir ve sonuç geçersiz olmayacaktır, kullanım concat_ws()değerleri (daha sonra Postgres 9.1 ya da) herhangi bir sayıda bitiştirmek için:

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

Veya concat()ayırıcılara ihtiyacınız yoksa:

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

Her iki işlev de "any"girdi aldığından ve metin gösterimleriyle çalıştığından burada tür yayınlarına gerek yoktur .

COALESCEBu ilgili yanıtta daha fazla ayrıntı (ve neden kötü bir ikame edicidir):

İçinde güncellemeyi İlişkin Yorumlarınız

+Postgres'de (veya standart SQL'de) dize birleştirmesi için geçerli bir operatör değil. Bunu ürünlerine eklemek Microsoft'un özel bir fikri.

Kullanmak için neredeyse hiç iyi bir neden yoktur character(n)(eşanlamlı:) char(n). textVeyavarchar tuşunu kullanın . Detaylar:


Teşekkür ederim. 1. sürüm null ile çalışmaz ve 2. Açık tür yayınlar eklemeniz gerekebilir.
Alex

1
Gördün Postgres 9.1 or laterdeđil mi? Sen başlamak için Postgres sürümünüzü sağlamış olmalıdır söz konusu . Başka bir şey için geri dönmeden önce lütfen sorunuzu istenen tüm bilgilerle güncelleyin .
Erwin Brandstetter

Teşekkür ederim, bulduğum çözüm herhangi bir Postgres sürümü için çalışıyor
Alex

SELECT concat(a, b) FROM foo;Postgres 9.3 benim için çalışmalar ave bvardır VARCHARlar.
elimisteve

Cevabınız için teşekkür ederim, sorunumu çözdü :).
ashwaqar

34

Sorun değerlerde null idi; bu durumda birleştirme null'larla çalışmaz. Çözüm aşağıdaki gibidir:

SELECT coalesce(a, '') || coalesce(b, '') FROM foo;

18

birleştirme için PostgreSQL'de CONCAT işlevini kullanmak daha iyidir

Örneğin : select CONCAT(first_name,last_name) from person where pid = 136

column_a || '' || column_a veya column_b içindeki değerlerden herhangi biri null sorgu ise, sütun için 2 sütun için birleştirme null değeri döndürür. her durumda tercih edilmeyebilir .. bunun yerine

||

kullanım

CONCAT

eğer bunlardan herhangi birinin değeri varsa ilgili değeri döndürür


7

CONCAT işlevleri bazen eski postgreSQL sürümü ile çalışmaz

CONCAT kullanmadan sorunu çözmek için ne kullandığımı görün

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

Ya da kullanabilirsiniz

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

ikinci durumda ad_adı ve son_adı için çift tırnak kullandım

Umarım faydalı olur, teşekkürler


1
benim adım veya soyad null ise concat değeri de null gösteriyor
Lokesh

2

Ben de bu sıkışmış gibi, benim için en uygun çözümü paylaşmak gerektiğini düşünüyorum. Bunun çok daha basit olduğunu düşünüyorum.

Büyük Harfli tablo adı kullanıyorsanız.

SELECT CONCAT("firstName", ' ', "lastName") FROM "User"

Küçük tablo adı kullanırsanız

SELECT CONCAT(firstName, ' ', lastName) FROM user

Bu kadar!. PGSQL, sütun bildirimi için Çift Alıntı ve dize için Tek Alıntı saydığından, bu bir cazibe gibi çalışır.


1

PHP'nin Laravel çerçevesi, ben first_name arama kullanıyorum, last_name Alanlar Tam Ad Arama gibi düşünün

|| kullanımı sembol Veya concat_ws (), concat () yöntemleri

$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);

Bu çalıştı çekicilik !!!



-1

Örneğin, aşağıdaki gibi sütunlardan oluşan bir çalışan tablosu varsa:

employee_number,f_name,l_name,email_id,phone_number 

Biz bitiştirmek istiyorsanız f_name + l_namekadar name.

SELECT employee_number,f_name ::TEXT ||','|| l_name::TEXT  AS "NAME",email_id,phone_number,designation FROM EMPLOYEE;

Bu cevap mevcut cevaplara ne katıyor?
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.