开发者社区 > 数据库 > 数据仓库 > 正文

"云数据仓库ADB中中有数组转成字符串的函数吗?

"云数据仓库ADB中中有数组转成字符串的函数吗?好像concat_ws 用不了。
有类似这种功能吗?
SELECT owner_company_id
,owner_company_name
,concat_ws(',', COLLECT_SET(owner_dept_id)) AS owner_dept_ids
,concat_ws(',',COLLECT_SET(owner_dept_name) ) AS owner_dept_names
,COUNT(*) AS order_num
,SUM(budget / 100 / 10000) AS total_budget
FROM dws_bid_all_order_info_da
WHERE order_type IN ('招标','询比')
AND status_name != '已流标'
AND (
owner_company_id IN (5,27,14)
OR owner_dept_id IN (12,62,10,15,79,7)
)
GROUP BY owner_company_id
,owner_company_name"

展开
收起
十一0204 2023-07-23 22:53:18 151 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    你提到的concat_ws函数实际上是MySQL才有的函数,而ADB是基于Presto的。

    Presto作为分布式SQL查询引擎,只提供了比较基础的函数,没有array_to_string这样的高级函数。

    不过你还有一些可选方案可以实现类似的效果:

    用字符串拼接函数concat
    presto
    Copy
    SELECT owner_company_id,
    owner_company_name,
    concat('{', concat_ws(',',COLLECT_SET(owner_dept_id)),'}') AS owner_dept_ids
    FROM ...
    用聚合函数string_agg
    presto
    Copy
    SELECT owner_company_id,
    owner_company_name,
    string_agg(owner_dept_id, ',') within GROUP(owner_dept_id) AS owner_dept_ids
    FROM ...
    GROUP BY owner_company_id, owner_company_name
    自己写UDF函数
    你也可以定义一个自己的array_to_string函数,然后注册为UDF,在查询时直接调用。

    总的来说,ADB本身没有将数组转字符串的内置函数。
    但是你可以使用concat或string_agg函数,或者自定义UDF,来实现类似的效果。

    2023-07-27 19:12:19
    赞同 1 展开评论 打赏
  • 在云数据仓库 AnalyticDB for MySQL (ADB) 中,确实没有内置的将数组转换为字符串的函数。concat_ws 函数也是不支持使用的。

    然而,您可以通过自定义函数来实现将数组转换为字符串的功能。以下是一个示例的自定义函数,用于将数组转换为逗号分隔的字符串:

    CREATE FUNCTION array_to_string(arr ARRAY)
    RETURNS VARCHAR(1000)
    BEGIN
        DECLARE i INT DEFAULT 1;
        DECLARE result VARCHAR(1000) DEFAULT '';
    
        WHILE i <= ARRAY_LENGTH(arr, 1) DO
            SET result = CONCAT(result, IF(i > 1, ',', ''), arr[i]);
            SET i = i + 1;
        END WHILE;
    
        RETURN result;
    END;
    

    使用这个自定义函数,您可以在您的查询中调用它,例如:

    SELECT 
        owner_company_id,
        owner_company_name,
        array_to_string(COLLECT_SET(owner_dept_id)) AS owner_dept_ids,
        array_to_string(COLLECT_SET(owner_dept_name)) AS owner_dept_names,
        COUNT(*) AS order_num,
        SUM(budget / 100 / 10000) AS total_budget
    FROM dws_bid_all_order_info_da
    WHERE order_type IN ('招标', '询比')
        AND status_name != '已流标'
        AND (owner_company_id IN (5, 27, 14) OR owner_dept_id IN (12, 62, 10, 15, 79, 7))
    GROUP BY 
        owner_company_id,
        owner_company_name;
    

    注意,这只是一个示例的自定义函数,并且可能需要根据您的具体需求进行适当的修改和调整。如果需要更复杂的数组转换操作,可能需要编写更为复杂的自定义函数。

    2023-07-25 18:50:20
    赞同 展开评论 打赏

阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。

相关产品

  • 云原生数据仓库 AnalyticDB PostgreSQL版
  • 相关电子书

    更多
    基于阿里云MaxCompute构建企业云数据仓库CDW的最佳实践建议 立即下载
    PostgresChina2018_陶征霖_新一代数据仓库OushuDB架构剖析 立即下载
    MaxCompute数据仓库数据转换实践 立即下载