PrestoDB多值查询问题:如何选择数组值替代concat('#value1','#value2')
解决PrestoDB中用数组值替代硬编码concat的问题
看起来你是在结合BI模板语法和PrestoDB生成Dashboard跳转链接,想要替换硬编码的concat('#value1','#value2'),改用数组值来实现更灵活的取值逻辑。下面给你几个适配Presto语法的可行方案:
方案1:直接选取数组中的特定元素
如果你有固定数组或动态生成的数组,想要从中选取单个/多个元素替代硬编码值,可以利用Presto的1-based数组下标直接访问元素:
比如从预设数组中选取元素作为filter_values的默认值:
SELECT * FROM ( VALUES concat('<a href="https:test?preselect_filters=', url_encode(concat('{"27":{','"column_name":["', CAST({{ "'" + "','"join(filter_values('column_name', array_join(array['#value1','#value2'], ','))) + "'" }} AS VARCHAR), '"]', ',','}}')), '#TAB-bEGT8cU5h">Qun', '</a>') ) dashboard_link (links)
如果只需要数组中的某一个元素(比如第一个),可以简化成:
filter_values('column_name', array['#value1','#value2'][1])
方案2:动态给数组元素加#前缀并拼接
如果你的目标是自动给一组值加上#前缀再拼接,不需要逐个硬编码#value,可以用transform函数给数组元素批量加前缀,再用array_join拼接:
SELECT * FROM ( VALUES concat('<a href="https:test?preselect_filters=', url_encode(concat('{"27":{','"column_name":["', CAST({{ "'" + "','"join(filter_values('column_name', array_join(transform(ARRAY['value1','value2'], x -> '#' || x), ','))) + "'" }} AS VARCHAR), '"]', ',','}}')), '#TAB-bEGT8cU5h">Qun', '</a>') ) dashboard_link (links)
这里transform(ARRAY['value1','value2'], x -> '#' || x)会把原数组的每个元素自动加上#,变成['#value1','#value2'],再通过array_join拼接成字符串供filter_values使用。
方案3:结合coalesce使用动态数组作为默认值
如果filter_values('column_name')本身会返回数组(比如用户选择的过滤器值),你可以用coalesce实现“有选中值用选中值,无选中值用预设数组”的逻辑,彻底摆脱硬编码:
SELECT * FROM ( VALUES concat('<a href="https:test?preselect_filters=', url_encode(concat('{"27":{','"column_name":["', CAST({{ "'" + "','"join(coalesce(filter_values('column_name'), ARRAY['#value1','#value2'])) + "'" }} AS VARCHAR), '"]', ',','}}')), '#TAB-bEGT8cU5h">Qun', '</a>') ) dashboard_link (links)
注意事项
你模板中的"','"join(...)属于BI工具(比如Looker)的模板函数,需要确保它能正确解析Presto返回的数组格式,将数组元素转换为'val1','val2'的字符串格式,才能和你外层的SQL语法兼容。
内容的提问来源于stack exchange,提问作者ottis79
相关产品推荐
相关产品推荐

