SORU
4 EYLÜL 2008, PERŞEMBE


Nasıl bir PostgreSQL '' sorgu tarafından grup içinde bir dize alanı dizeleri bitiştirmek için?

Bir sorgu tarafından bir grup içindeki bir alanın dizeleri bitiştirmek için arıyorum. Yani, örneğin, bir tablo var:

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

ve company_id tarafından grup gibi bir şey olsun istedim:

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

Bir yerleşik mySQL fonksiyonu group_concat bunu yapmak için var

CEVAP
4 EYLÜL 2008, PERŞEMBE


PostgreSQL 9.0 olarak güncelleme:

PostgreSQL son sürümleri (geç 2010 yılından bu yana) soru istedi tam olarak bunu bile izin sınırlayıcı dize belirteceksiniz string_agg(expression, delimiter) işlevi vardır:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

PostgreSQL 8.4 olarak güncelleme:

PostgreSQL 8.4 (2009) bir diziye değerleri birleştirir the aggregate function array_agg(expression) tanıttı. O zaman array_to_string() istenilen sonucu vermesi için kullanılabilir:

SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;

(Pre-8.4 PostgreSQL için) orijinal Cevabı:

Yerleşik bitiştirmek için toplama işlevi yoktur. Bu gerekli olacak gibi görünüyor, ama varsayılan kümesini bir parçası değil. İnternette aradım ancak bazı el uygulamaları the same example ortaya koymaktadır:

CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);

Here is the CREATE AGGREGATE documentation.

Bu almak için ", " onların arasına yerleştirilir sonuna kalmadan, kendi birleştirme işlevi yapmak ve "" yukarıda. textcat yerine isteyebilirsiniz Burada birleştirdim ama test etmedim (güncelleme:8.3.12 üzerinde test edilmiş ve iyi çalışıyor):

CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;

Not:Yukarıdaki fonksiyonu olan çıktıları satır değeri boş/boş değilse bile bir virgül çıktı

a, b, c, , e, , g

Çıkış için ekstra virgül kaldırmak isterseniz:

a, b, c, e, g

sadece işlevi için ELSIF bir onay ekleyin:

CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
  BEGIN
    IF acc IS NULL OR acc = '' THEN
      RETURN instr;
    ELSIF instr IS NULL OR instr = '' THEN
      RETURN acc;
    ELSE
      RETURN acc || ', ' || instr;
    END IF;
  END;
$$ LANGUAGE plpgsql;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EmperorTigerstar

    EmperorTiger

    14 EYLÜL 2009
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011