Home > Net >  Snowflake LISTAGG Encapsulate Values
Snowflake LISTAGG Encapsulate Values

Time:01-13

I was wondering if anyone has solved being able to encapsulate values in the LISTAGG function for Snowflake.

I have a table that looks something like this

ID NAME
1 PC
1 PC,A
2 ER

The following query:

SELECT
    ID,
    LISTAGG(DISTINCT NAME, ',') AS LIST
FROM TEST_TABLE

will return this table

ID LIST
1 PC,PC,A
2 ER

My expected result would be:

ID LIST
1 PC,"PC,A"
2 ER

Does anyone know how to get the expected result? I thought about testing if the value had a comma and then a CASE WHEN to switch the logic based on that.

CodePudding user response:

We can aggregate using a CASE expression which detects commas, in which case it wraps the value in double quotes.

SELECT
    ID,
    LISTAGG(DISTINCT CASE WHEN NAME LIKE '%,%'
                          THEN CONCAT('"', NAME, '"')
                          ELSE NAME END, ',') AS LIST
FROM TEST_TABLE;

CodePudding user response:

If I had to use listagg, I would have picked a different delimiter, like so..

select listagg(distinct name,'|')
from t;

Personally, I find array_agg easier to work with in cases like yours

select array_agg(distinct name)
from t;
  • Related