如何使用雪花中的表格自动进行字段映射

时间:2019-06-26 03:13:38

标签: sql snowflake-datawarehouse

我的雪花数据库中有一个列表,其中包含以下JSON映射结构

ColumnMappings : {"Field Mapping": "blank=Blank,E=East,N=North,"}

如何编写一个查询,如果输入Field Mapping的值为E,我将得到East;如果输入N的值,我将得到{{1 }}等等,而无需像North语句所提供的那样对查询中的值进行硬编码。

1 个答案:

答案 0 :(得分:1)

您确实希望以这种JSON形式进行映射:

{
  "blank" : "Blank",
  "E" : "East",
  "N" : "North"
}

您可以在Snowflake中实现此目标,例如一个简单的JS UDF:

create or replace table x(cm variant) as
select parse_json(*) from values('{"fm": "blank=Blank,E=East,N=North,"}');

create or replace function mysplit(s string)
returns variant
language javascript
as $$
res = S
  .split(",")
  .reduce(
    (acc,val) => {
      var vals = val.split("=");
      acc[vals[0]] = vals[1];
      return acc;
    },
    {});

return res;
$$;

select cm:fm, mysplit(cm:fm) from x;
-------------------------------+--------------------+
             CM:FM             |   MYSPLIT(CM:FM)   |
-------------------------------+--------------------+
 "blank=Blank,E=East,N=North," | {                  |
                               |   "E": "East",     |
                               |   "N": "North",    |
                               |   "blank": "Blank" |
                               | }                  |
-------------------------------+--------------------+

然后您可以简单地使用GET通过键提取值,例如

select cm:fm, get(mysplit(cm:fm), 'E') from x;
-------------------------------+--------------------------+
             CM:FM             | GET(MYSPLIT(CM:FM), 'E') |
-------------------------------+--------------------------+
 "blank=Blank,E=East,N=North," | "East"                   |
-------------------------------+--------------------------+

为了提高性能,您可能需要确保在映射表中每个值仅调用一次mysplit,甚至预先实现它。