【问题标题】:Consecutive LOOP through different fields from different not linked tables通过来自不同未链接表的不同字段的连续循环
【发布时间】:2017-09-28 04:18:51
【问题描述】:

我有几个表格展示了网站上的不同实体。它们之间的链接对我的任务无关紧要。 (这也不是我的设计)。 我想通过一些文本字段来完成翻译、拼写检查等艰苦的工作。有很多文本。

我的问题是:我可以通过所有这些表按顺序查询 FOR LOOP。下面示例中的 array_cat 是一个适当的决定,还是会吃掉我所有的公羊?还有另一种变体 - 制作第二个函数,接收表名作为参数。我很乐意选择一个更简单的决定。

下面的这个测试示例不适用于 array_cat 中的语法错误。运算符 ||也给了我语法错误。

DO
$$
DECLARE
  qs TEXT;
BEGIN
  FOR qs IN array_cat( -- as @ammoQ suggested to do UNION ALL
    SELECT array_agg(messages) FROM posts UNION ALL
    SELECT array_agg(comments) FROM boards )
  LOOP
    -- here I need: count chars really processed
    -- to do not exceed the billing quota of external api
    -- then make an UPSERT into cache table for another long process
    -- if quota is not exceeded
  END LOOP;
-- and return total of processed symbols
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

  • 我不明白您为什么要将文本聚合到数组中并在稍后将所有内容连接起来以对文本进行处理...为什么不在每个文本列上执行相同的大量工作分别在每一行中?..而不是在循环中,而是在SELECT?..
  • 我只是不知道正确的 sql 方式。在进行了一些优化之后,我只需要在循环内执行一个 UPSERT 即可。我编辑了这个例子。
  • 请提供表格和数据示例以及文本进程示例。我觉得这里的plpgsql处理太贵了

标签: sql postgresql loops select plpgsql


【解决方案1】:

使用union

编辑:删除array_agg

DO
$$
DECLARE
  qs TEXT;
BEGIN
  FOR qs IN (
    SELECT messages x FROM posts union all
    SELECT comments FROM boards )
  LOOP
    RAISE DEBUG 'TEXT is %', qs.x;
  END LOOP;
END;
$$ LANGUAGE plpgsql;

【讨论】:

  • 看起来 UNION ALL 让我很高兴 :) 如果没有 array_agg,这可以按我的意愿工作。但我需要更多。据我所知,如果字符配额超过,递归 CTE 可以完成打破循环的工作。用例 - 我们购买了翻译 API 来处理 128000000 个符号。因此,当达到此限制时,我必须停止处理。在这种情况下哪个更好:rCTE 还是 FOR LOOP?
猜你喜欢
  • 2021-11-02
  • 2016-01-02
  • 2021-10-13
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多