PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggabungkan string bidang string dalam kueri 'grup menurut' PostgreSQL?

PostgreSQL 9.0 atau yang lebih baru:

Postgres modern (sejak 2010) memiliki string_agg(expression, delimiter) fungsi yang akan melakukan persis seperti yang dicari penanya:

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

Postgres 9 juga menambahkan kemampuan untuk menentukan ORDER BY klausa dalam ekspresi agregat apa pun; jika tidak, Anda harus memesan semua hasil Anda atau menangani pesanan yang tidak ditentukan. Jadi sekarang Anda dapat menulis:

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

PostgreSQL 8.4.x:

PostgreSQL 8.4 (tahun 2009) memperkenalkan fungsi agregat array_agg(expression) yang mengumpulkan nilai-nilai dalam array. Kemudian array_to_string() dapat digunakan untuk memberikan hasil yang diinginkan:

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

PostgreSQL 8.3.x dan yang lebih lama:

Ketika pertanyaan ini awalnya diajukan, tidak ada fungsi agregat bawaan untuk menggabungkan string. Implementasi kustom paling sederhana (disarankan oleh Vajda Gabo di pos milis ini, di antara banyak lainnya) adalah dengan menggunakan textcat bawaan fungsi (yang terletak di belakang || operator):

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

Berikut adalah CREATE AGGREGATE dokumentasi.

Ini hanya merekatkan semua senar bersama-sama, tanpa pemisah. Untuk mendapatkan "," yang disisipkan di antara mereka tanpa memilikinya di akhir, Anda mungkin ingin membuat fungsi gabungan Anda sendiri dan menggantinya dengan "textcat" di atas. Ini yang saya kumpulkan dan uji pada 8.3.12:

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;

Versi ini akan menampilkan koma meskipun nilai pada baris tersebut null atau kosong, sehingga Anda mendapatkan output seperti ini:

a, b, c, , e, , g

Jika Anda lebih suka menghapus koma tambahan untuk menampilkan ini:

a, b, c, e, g

Kemudian tambahkan ELSIF periksa ke fungsinya seperti ini:

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan Menginstal Psycopg2 di MacOS 10.9.5

  2. Dapatkan Hari dari Tanggal di PostgreSQL

  3. Tentang indeks berkerumun di postgres

  4. Penyortiran PostgreSQL salah

  5. Cara mengonfigurasi AppArmor untuk PostgreSQL dan TimescaleDB