如何使用Qlik Sense加载SQL数据库中存储的Array Pair为指定表格格式
Qlik Sense SQL元组列表数据转换解决方案
以下是两种可直接落地的实现方式:
方案1:SQL侧预处理(性能最优,优先选择)
针对支持JSON解析函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等),直接在取数查询时完成格式转换,无需后续在Qlik中二次处理。
示例查询(以MySQL为例,表名source_table,存储列表的字段名为raw_data):
SELECT j.id, j.value FROM source_table, JSON_TABLE( -- 先将元组格式字符串转为标准JSON数组格式 REPLACE(REPLACE(REPLACE(raw_data, '(', '['), ')', ']'), "'", '"'), '$[*]' COLUMNS ( id INT PATH '$[0]', value VARCHAR(10) PATH '$[1]' ) ) j;
方案2:Qlik Sense加载脚本内处理
若无法修改SQL查询逻辑,直接在Qlik数据加载编辑器中编写脚本完成解析:
- 第一步先加载SQL侧的原始数据到临时表
RawData: LOAD raw_data // 替换为你实际存储列表的字段名 RESIDENT [SQL导入的源表名称]; // 替换为你从SQL加载到Qlik的表名
- 第二步解析字符串生成目标结构化表
ResultTable: LOAD // 提取ID字段 SubField(SubField(pair, ',', 1), '(', 2) AS ID, // 提取Value字段,去除多余符号和空格 Trim(Replace(Replace(SubField(pair, ',', 2), "'", ''), ')', '')) AS Value WHILE // 按元组分隔符拆分原始字符串,循环遍历所有元组 SubField(Replace(Replace(raw_data, '[', ''), ']', ''), '), (', IterNo()) AS pair RESIDENT RawData; // 释放临时表占用的内存 DROP TABLE RawData;
如果你给出的示例中ID=3的取值需要从
c转换为v,可额外增加映射逻辑:ValueMap: Mapping LOAD * INLINE [ old_val, new_val c, v ]; // 将ResultTable中Value的定义替换为以下内容即可 ApplyMap('ValueMap', Trim(Replace(Replace(SubField(pair, ',', 2), "'", ''), ')', '')), Trim(Replace(Replace(SubField(pair, ',', 2), "'", ''), ')', ''))) AS Value
内容的提问来源于stack exchange,提问作者user17155772
相关产品推荐
相关产品推荐

