NetSuite中使用LIST_AGG拼接列值失败,求实现方案或替代函数
NetSuite 字段值拼接查询解决方案
NetSuite 使用的 SuiteQL 语法不支持标准 SQL 中的LIST_AGG函数,你可以使用以下两种方案实现字段值拼接需求:
方案1:使用官方推荐的STRING_AGG聚合函数(推荐)
STRING_AGG是NetSuite SuiteQL原生支持的字符串拼接聚合函数,支持自定义分隔符。你原来的SQL缺少GROUP BY子句,会导致聚合查询报错,修正后的完整SQL如下:
SELECT t.id, STRING_AGG(tn.trackingnumber, ',') AS tracking_numbers FROM transaction t LEFT JOIN trackingnumber tn ON INSTR(', '||t.trackingnumberlist||', ', ', '||tn.id||', ') > 0 WHERE t.id = 1 GROUP BY t.id
如果需要对拼接的内容去重,可以修改为STRING_AGG(DISTINCT tn.trackingnumber, ',');如果需要处理空值避免NULL影响结果,可以搭配NVL函数使用:STRING_AGG(NVL(tn.trackingnumber, ''), ',')。
如果你的NetSuite版本较旧不支持STRING_AGG,可以使用旧版聚合函数NS_CONCAT(tn.trackingnumber),该函数默认使用逗号作为分隔符,不支持自定义分隔符。
方案2:使用层次查询实现拼接(备选)
如果遇到函数权限限制无法使用聚合函数,可以用层次查询手动实现拼接:
SELECT id, LTRIM(SYS_CONNECT_BY_PATH(trackingnumber, ','), ',') AS tracking_numbers FROM ( SELECT t.id, tn.trackingnumber, ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY tn.id) AS rn, COUNT(*) OVER (PARTITION BY t.id) AS cnt FROM transaction t LEFT JOIN trackingnumber tn ON INSTR(', '||t.trackingnumberlist||', ', ', '||tn.id||', ') > 0 WHERE t.id = 1 ) WHERE rn = cnt START WITH rn = 1 CONNECT BY PRIOR rn = rn - 1 AND PRIOR id = id
内容的提问来源于stack exchange,提问作者Chakreshwar Sharma
相关产品推荐
相关产品推荐

