Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to concatenate arrays in Snowflake with distinct values?

I have a MERGE scenario with an ARRAY_AGG() function in the main script. Once I have a match I'd like to combine the arrays from the source and target table but don't want to add existing values. I've looked at using ARRAY_CAT() but it doesn't return the expected output

This is the query:

SELECT
  ARRAY_CAT(ARRAY_CONSTRUCT('VALUE 1', 'VALUE 2'), ARRAY_CONSTRUCT('VALUE 1', 'VALUE 3')) arr_col

But this returns:

ARR_COL
[ "VALUE 1", "VALUE 2", "VALUE 1", "VALUE 3" ]

And what I need is :

ARR_COL
[ "VALUE 1", "VALUE 2", "VALUE 3" ]

Is there an easy way to achieve this except converting to string, removing the dups with regex then splitting to array?

like image 755
Andrei Budaes Avatar asked Nov 16 '25 10:11

Andrei Budaes


2 Answers

Use ARRAY_DISTINCT after ARRAY_CAT inline:

SELECT
  ARRAY_DISTINCT(ARRAY_CAT(ARRAY_CONSTRUCT('VALUE 1', 'VALUE 2'), ARRAY_CONSTRUCT('VALUE 1', 'VALUE 3'))) as arr_col

returns ["VALUE 1", "VALUE 2", "VALUE 3"]

like image 156
Nelson Avatar answered Nov 18 '25 20:11

Nelson


I've created an UDF in the end that allows me to do this as a scalar function

// Distinct Concatenate
create or replace function array_dcat(array1 variant, array2 variant)
    returns variant
    language javascript
    comment = 'Returns a distinct concatenation of two arrays'
as
$$
     return Array.from(new Set([...ARRAY1,...ARRAY2]));
$$
;

I used if as follows

SELECT
  ARRAY_CONSTRUCT('VALUE 1', 'VALUE 2') arr1,
  ARRAY_CONSTRUCT('VALUE 1', 'VALUE 3') arr2,
  ARRAY_CAT(arr1, arr2) sn_array_cat,
  ARRAY_DCAT(arr1, arr2) udf_array_dcat;

And returns

ARR1 ARR2 SN_ARRAY_CAT UDF_ARRAY_CAT
[ "VALUE 1", "VALUE 2" ] [ "VALUE 1", "VALUE 3" ] [ "VALUE 1", "VALUE 2", "VALUE 1", "VALUE 3" ] [ "VALUE 1", "VALUE 2", "VALUE 3" ]
like image 22
Andrei Budaes Avatar answered Nov 18 '25 21:11

Andrei Budaes



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!