postgresql 使用数组作为参数的PSQL存储过程

8zzbczxx  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(171)

我正在使用PostgreSQL,目前正在创建一个存储过程来做一些计算。我已经搜索了一上午并阅读了文档,但要么我想要的功能不受支持,要么我一定忽略了一些东西。基本上,这是我所拥有的:

CREATE OR REPLACE FUNCTION predict_usage(preWaitTimes text, afterEndTimes text, targetIds text, drivingTime numeric, arrivalTime timestamp with time zone)
    RETURNS TABLE(
       target_id text,
       pre_wait_time numeric,
       after_end_time numeric,
       driving_time numeric,
       starting_time timestamp with time zone,
       ending_time timestamp with time zone
    )
DECLARE
    target_ids uuid[] := string_to_array(targetIds, ',')::uuid;
    pre_wait_times integer[] := string_to_array(preWaitTimes, ',')::integer[];
    after_end_times integer[] := string_to_array(afterEndTimes, ',')::integer[];
BEGIN
SELECT *
FROM generate_series(1, ceil(target.quantity/target.size)) as series,
END;

基本上,我会计算需要多长时间出差一次才能交付某件东西,我使用generate_series来计算。这在一个SQL查询中就可以实现,我可以使用它来计算需要多少个驱动器才能交付所有东西,每个驱动器都有自己的开始时间和结束时间。
现在,由于不同的targets有不同的准备和结束时间(preWaitTimesafterEndTimes),我需要以某种方式将当前使用的target_id的索引与这些额外时间的数组连接起来,以便进行计算。
我已经尝试了一个FOR循环,但是没有成功运行它。我怀疑数据库是否能很好地优化FOR循环,我可以在Java后端解决它。目标是在数据库中进行,主要是为了速度。
编辑:
经过思考,也许加入3个数组到一个表开始 *,然后 * 我的计算可以工作吗?

pcrecxhr

pcrecxhr1#

经过更多的文档和搜索,我找到了使用UNNEST的解决方案:

SELECT UNNEST(arr1::uuid[]) as id, UNNEST(arr2::text[]) as name, UNNEST(arr3::numeric[]) as value
...

*收件人:

创建的表有一些限制。例如,如果id是一个uuid[],它使用的id与您要联接的表中的PK相同,它将以某种方式 * 不 * 执行散列联接。这可以通过以下语句来避免:

....
WHERE target_table.id = generated_table.id
    and target_table.id = any(arr1::uuid[])

相关问题