具有 DISTINCT 值的 Snowflake CONCAT 字符串
Snowflake CONCAT strings with DISTINCT values
我正在进行合并,其中一个字符串存在于我的目标 table。
为此,我想连接一个新的增量值,它是一个; my
中的分隔字符串列表
WHEN MATCHED .... UPDATE clause
eg.
set TARGET_VALUE = 'abc';
set DELTA = 'abc;def';
连接后:
OUTPUT should be abc;def;
select CONCAT($TARGET_VALUE,';', $DELTA);
Gives me abc;abc;def.
有没有一种方法可以在不将字符串转换为数组的情况下实现此内联并执行以下操作: ?
我想避免创建自定义函数或代码段,并检查是否有内联方法来实现此目的。
我写了一个 UDF 来实现这个,但是有内联的方式吗?
set TARGET_VALUE = 'xyhx;abc';
set DELTA = 'abc;def';
select string_distinct_concat($TARGET_VALUE, $DELTA);
// Distinct Concatenate
create or replace function string_distinct_concat(target varchar, delta varchar)
returns variant
language javascript
comment = 'Returns a distinct concatenation of two strings'
as
$$
if (TARGET == null) {
return DELTA
}
if (DELTA == null) {
return TARGET
}
const target_array = TARGET.split(';');
const delta_array = DELTA.split(';');
const set = new Set([...target_array,...delta_array])
return [...set].join(';');
$$
;
这是一种使用 split_to_table 和带有 distinct 的 listagg 的方法。
set TARGET_VALUE = 'abc';
set DELTA = 'abc;def';
select listagg(distinct t.value,';') final_val from
table(split_to_table(concat($DELTA,';',$TARGET_VALUE),';')) t;
FINAL_VAL
abc;def
使用 DELTA 中的部分字符串设置目标。
这应该包含在最终输出中。
set TARGET_VALUE = 'ab';
select listagg(distinct t.value,';') final_val from
table(split_to_table(concat($DELTA,';',$TARGET_VALUE),';')) t;
FINAL_VAL
abc;def;ab
这里有两种处理 NULL 的方法,我更喜欢 CTE 方法
with var_cte as
(
select column1 as var from values
($DELTA),
($TARGET_VALUE)
), no_null_cte as
(
select t.value from var_cte, table(split_to_table(var,';')) t
)select listagg(distinct value,';') from no_null_cte;
使用 NVL -
select listagg(distinct t.value,';') from table
(
split_to_table(concat(nvl($DELTA,''),';',nvl($TARGET_VALUE,'')),';')) t
where t.value != '';
我正在进行合并,其中一个字符串存在于我的目标 table。
为此,我想连接一个新的增量值,它是一个; my
中的分隔字符串列表WHEN MATCHED .... UPDATE clause
eg.
set TARGET_VALUE = 'abc';
set DELTA = 'abc;def';
连接后:
OUTPUT should be abc;def;
select CONCAT($TARGET_VALUE,';', $DELTA);
Gives me abc;abc;def.
有没有一种方法可以在不将字符串转换为数组的情况下实现此内联并执行以下操作:
我想避免创建自定义函数或代码段,并检查是否有内联方法来实现此目的。
我写了一个 UDF 来实现这个,但是有内联的方式吗?
set TARGET_VALUE = 'xyhx;abc';
set DELTA = 'abc;def';
select string_distinct_concat($TARGET_VALUE, $DELTA);
// Distinct Concatenate
create or replace function string_distinct_concat(target varchar, delta varchar)
returns variant
language javascript
comment = 'Returns a distinct concatenation of two strings'
as
$$
if (TARGET == null) {
return DELTA
}
if (DELTA == null) {
return TARGET
}
const target_array = TARGET.split(';');
const delta_array = DELTA.split(';');
const set = new Set([...target_array,...delta_array])
return [...set].join(';');
$$
;
这是一种使用 split_to_table 和带有 distinct 的 listagg 的方法。
set TARGET_VALUE = 'abc';
set DELTA = 'abc;def';
select listagg(distinct t.value,';') final_val from
table(split_to_table(concat($DELTA,';',$TARGET_VALUE),';')) t;
FINAL_VAL |
---|
abc;def |
使用 DELTA 中的部分字符串设置目标。 这应该包含在最终输出中。
set TARGET_VALUE = 'ab';
select listagg(distinct t.value,';') final_val from
table(split_to_table(concat($DELTA,';',$TARGET_VALUE),';')) t;
FINAL_VAL |
---|
abc;def;ab |
这里有两种处理 NULL 的方法,我更喜欢 CTE 方法
with var_cte as
(
select column1 as var from values
($DELTA),
($TARGET_VALUE)
), no_null_cte as
(
select t.value from var_cte, table(split_to_table(var,';')) t
)select listagg(distinct value,';') from no_null_cte;
使用 NVL -
select listagg(distinct t.value,';') from table
(
split_to_table(concat(nvl($DELTA,''),';',nvl($TARGET_VALUE,'')),';')) t
where t.value != '';