Verwendung von STRING_AGG für prägnante Abfrageergebnisse

Die string_agg-Funktion in SQL ist eine Aggregatfunktion, die Zeichenfolgen aus mehreren Zeilen zu einer einzigen Zeichenfolge mit verschiedenen Optionen verknüpft (zusammenfügt).

Sie ist besonders nützlich, wenn Sie Werte aus einer Spalte für jede Datengruppe in Ihren Berichten kombinieren möchten, und kann Ihr Abfrageergebnis leichter lesbar machen, insbesondere bei vielen-zu-vielen-Beziehungen. Wenn Sie beispielsweise einen Bericht erstellen möchten, der alle für ein Thema verwendeten Tags anzeigt, könnten Sie string_agg verwenden, um alle Tags für jedes Thema zu einer einzigen Zeichenfolge zu verketten.

Syntax

Hier ist die grundlegende Syntax von string_agg:

STRING_AGG(expression, delimiter)

Die Funktion string_agg nimmt zwei Parameter entgegen:

  • expression: Der zu verknüpfende Wert.
  • delimiter: Das Trennzeichen, das zwischen den Zeichenfolgen eingefügt wird. Das Trennzeichen kann eine Zeichenfolge oder ein Zeichen sein.

Beispielverwendung in DE-Abfragen

Werfen wir einen Blick auf einige Beispielabfragen, die string_agg verwenden.

Alle Kategorien auf einer Website auflisten

Diese Abfrage verknüpft die Felder name und id aus der Tabelle categories zu einer einzigen Zeichenfolge, wobei jedes Paar aus name und id durch ’ : ’ und jedes Paar durch ', ’ getrennt wird. Die Paare werden dann nach id sortiert.

SELECT  
    -- Die Funktion STRING_AGG verknüpft die Felder 'name' und 'id' zu einer einzigen Zeichenfolge.
    -- Jedes Paar aus 'name' und 'id' wird durch ' : ' getrennt, und jedes Paar wird durch ', ' getrennt.
    -- Die Paare werden nach 'id' sortiert.
    STRING_AGG(name || ' : ' || id, ', ' ORDER BY id) AS category_list
FROM 
    categories -- Die Daten werden aus der Tabelle 'categories' ausgewählt.

Beispielergebnisse:

category_list
Uncategorized : 1, Site Feedback : 2, Staff : 3, Lounge : 4, Email : 5, Event : 6, Parent Category : 7, Sub Category

Alle Themen und zugehörige Tags auflisten

Diese Abfrage wählt die id aus der Tabelle topics aus und verknüpft die zugehörigen tags für jedes Thema zu einer einzigen Zeichenfolge. Jeder Tag wird durch ein Komma und ein Leerzeichen getrennt, und die Tags werden alphabetisch sortiert. Das Ergebnis wird nach der id des Themas gruppiert und nach den Tags sortiert. Wenn ein Thema keine Tags hat, ist die Spalte tags NULL.

SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM topics t
LEFT JOIN topic_tags tt ON tt.topic_id = t.id
LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY t.id   
ORDER BY tags

Das Ergebnis ist eine Liste formatierter Themen-IDs, jede mit einer Zeichenfolge zugehöriger, alphabetisch sortierter Tags. Zum Beispiel:

Beispielergebnisse:

topic tags
Welcome to the Lounge (3) tag1, tag2
A Very Safe for work post (3) tag3, tag4, tag,5
This is a blog tagged post (4) tag3
About the Lounge category (3) tag5
Welcome to your 14 day standard hosting trial! NULL
Detaillierte Erklärung mit Inline-Kommentaren
-- Diese SQL-Anweisung wählt Daten aus den Tabellen 'topics' und zugehörigen 'tags' aus.
SELECT 
    t.id topic_id, -- Wählt die 'id' aus der Tabelle 'topics' aus.
    -- Die Funktion STRING_AGG verknüpft die zugehörigen 'tags' für jedes Thema zu einer einzigen Zeichenfolge.
    -- Jeder Tag wird durch ein Komma und ein Leerzeichen getrennt, und die Tags werden alphabetisch sortiert.
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM 
    topics t -- Die Daten werden aus der Tabelle 'topics' ausgewählt.
    -- Die Tabelle 'topic_tags' wird über 'topic_id' aus der Tabelle 'topics' verknüpft.
    LEFT JOIN topic_tags tt ON tt.topic_id = t.id
    -- Die Tabelle 'tags' wird über 'tag_id' aus der Tabelle 'topic_tags' verknüpft.
    LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY 
    t.id -- Das Ergebnis wird nach der 'id' des Themas gruppiert.
ORDER BY
    "tags" -- Das Ergebnis wird nach den 'tags' sortiert.

Benutzer, die in Themen gepostet haben

Diese Abfrage gibt eine Liste von topic-IDs und -Titeln, die usernames der Benutzer, die in jedem Thema gepostet haben, und die Anzahl der eindeutigen Benutzer, die in jedem Thema gepostet haben, zurück. Die Ergebnisse werden dann nach der Anzahl der Benutzer in absteigender Reihenfolge sortiert.

SELECT
    topics.id AS "topic_id",
    topics.title AS "topic_title",
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics
JOIN
    posts ON posts.topic_id = topics.id
JOIN
    users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title
ORDER BY
    "user_count" DESC

Beispielergebnisse

topic topic_title users_posted user_count
Lets make a topic (10) Lets make a topic anonymous, user1, user2, user3 4
Another Topic (3) Another Topic user3, user4, user5 3
Discobot test (2) Discobot test user6 1
Detaillierte Erklärung mit Inline-Kommentaren
-- Diese SQL-Anweisung wählt Daten aus den Tabellen 'topics', 'posts' und 'users' aus.
SELECT
    topics.id AS "topic_id", -- Wählt die 'id' aus der Tabelle 'topics' aus.
    topics.title AS "topic_title", -- Wählt den 'title' aus der Tabelle 'topics' aus.
    -- Die Funktion STRING_AGG verknüpft die Benutzernamen der Benutzer, die in dem Thema gepostet haben, zu einer einzigen Zeichenfolge.
    -- Jeder Benutzername wird durch ein Komma und ein Leerzeichen getrennt, und die Benutzernamen werden alphabetisch sortiert.
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    -- Zählt die Anzahl der eindeutigen Benutzer, die in dem Thema gepostet haben.
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics -- Die Daten werden aus der Tabelle 'topics' ausgewählt.
    -- Die Tabelle 'posts' wird über 'topic_id' aus der Tabelle 'topics' verknüpft.
    JOIN posts ON posts.topic_id = topics.id
    -- Die Tabelle 'users' wird über 'id' aus der Tabelle 'posts' verknüpft.
    JOIN users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title -- Das Ergebnis wird nach der 'id' und dem 'title' des Themas gruppiert.
ORDER BY
    "user_count" DESC -- Das Ergebnis wird nach der Anzahl der Benutzer in absteigender Reihenfolge sortiert.

Das war’s für dieses Tutorial!

Wenn Sie Fragen oder Beispiele haben, wie Sie string_agg verwendet haben, teilen Sie diese gerne unten mit. :slightly_smiling_face:

6 „Gefällt mir“