PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Hàm STRING_AGG () trong PostgreSQL

Trong PostgreSQL, chúng ta có thể sử dụng STRING_AGG() chức năng trả về các cột từ truy vấn dưới dạng danh sách được phân tách.

Cú pháp

Cú pháp như sau:

string_agg ( value text, delimiter text ) → text
string_agg ( value bytea, delimiter bytea ) → bytea

Chúng tôi cũng có thể sử dụng ORDER BY mệnh đề và một DISTINCT mệnh đề từ bên trong hàm này, ảnh hưởng đến kết quả đầu ra từ hàm. Thông tin thêm về điều này bên dưới.

Ví dụ

Giả sử chúng ta chạy truy vấn sau:

SELECT PetName 
FROM Pets;

Và chúng tôi nhận được kết quả sau:

+---------+
| petname |
+---------+
| Fluffy  |
| Fetch   |
| Scratch |
| Wag     |
| Tweet   |
| Fluffy  |
| Bark    |
| Meow    |
+---------+
(8 rows)

Chúng tôi có thể sử dụng STRING_AGG() để trả về tất cả các hàng đó dưới dạng danh sách được phân tách.

Để thực hiện việc này, hãy chuyển PetName cột làm đối số đầu tiên và dấu phân cách đã chọn của chúng tôi làm đối số thứ hai:

SELECT STRING_AGG(PetName, ',') 
FROM Pets;

Kết quả:

+-------------------------------------------------+
|                   string_agg                    |
+-------------------------------------------------+
| Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
+-------------------------------------------------+
(1 row)

Thay đổi Dấu phân cách

Trong ví dụ trước, tôi đã chọn dấu phẩy làm dấu phân cách. Đây là dấu phân cách khác:

SELECT STRING_AGG(PetName, '-') 
FROM Pets;

Kết quả:

Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

Chúng tôi thậm chí có thể sử dụng một chuỗi trống để loại bỏ tất cả các dấu phân cách (để các giá trị được nối với nhau):

SELECT STRING_AGG(PetName, '') 
FROM Pets;

Và chúng tôi nhận được kết quả sau:

FluffyFetchScratchWagTweetFluffyBarkMeow

Đặt hàng

Chúng ta có thể sử dụng ORDER BY mệnh đề trong STRING_AGG() chức năng đặt hàng đầu ra của riêng nó:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

Kết quả:

Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

Đó là thứ tự tăng dần.

Đây là thứ tự giảm dần:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName DESC) FROM Pets;

Kết quả:

Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark

Lưu ý rằng điều này chỉ sắp xếp đầu ra của STRING_AGG() chức năng - nó hoàn toàn độc lập với bất kỳ thứ tự nào được áp dụng cho SELECT tuyên bố chính nó.

DISTINCT Mệnh đề

Chúng tôi có thể sử dụng DISTINCT mệnh đề để trả về các giá trị duy nhất. Nói cách khác, nếu có các giá trị trùng lặp, chỉ một lần xuất hiện được trả về:

SELECT STRING_AGG(DISTINCT PetName, ',' ORDER BY PetName ASC) FROM Pets;

Kết quả:

Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

Trong trường hợp này, Fluffy chỉ xuất hiện một lần. Khi chúng tôi chạy nó mà không có DISTINCT mệnh đề, Fluffy xuất hiện hai lần:

SELECT STRING_AGG(PetName, ',' ORDER BY PetName ASC) FROM Pets;

Kết quả:

Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

Kết quả truy vấn được nhóm

Chúng tôi có thể bao gồm STRING_AGG() trong một truy vấn với GROUP BY mệnh đề để đạt được kết quả như sau:

SELECT 
    PetTypeId,
    STRING_AGG(PetName, ',' ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;

Kết quả:

+-----------+-----------------------+
| pettypeid |      string_agg       |
+-----------+-----------------------+
|         1 | Tweet                 |
|         2 | Fluffy,Meow,Scratch   |
|         3 | Bark,Fetch,Fluffy,Wag |
+-----------+-----------------------+

Trong cơ sở dữ liệu của tôi, tên loại vật nuôi thực tế nằm trong một bảng khác được gọi là PetTypes . Do đó, chúng tôi có thể chạy INNER JOIN trên PetTypes bảng để lấy tên loại vật nuôi thực tế:

SELECT 
    pt.PetType,
    STRING_AGG(p.PetName, ',' ORDER BY p.PetName ASC)
FROM Pets p
INNER JOIN PetTypes pt ON
p.PetTypeId = pt.PetTypeId
GROUP BY pt.PetType
ORDER BY pt.PetType ASC;

Kết quả:

+---------+-----------------------+
| pettype |      string_agg       |
+---------+-----------------------+
| Bird    | Tweet                 |
| Cat     | Fluffy,Meow,Scratch   |
| Dog     | Bark,Fetch,Fluffy,Wag |
+---------+-----------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa LATERAL JOIN và một truy vấn con trong PostgreSQL là gì?

  2. Truy vấn LIKE trên các phần tử của mảng jsonb phẳng

  3. LỖI Postgres:không thể mở tệp để đọc:Quyền bị từ chối

  4. Trình điều khiển JDBC PostgreSQL với Android

  5. Cách Atand () hoạt động trong PostgreSQL