postgresql - postgresql 中的嵌套循环问题

标签 postgresql loops variables for-loop nested-loops

我想知道在 postgresql 中是否有一些与变量和嵌套循环相关的东西与其他语言的工作方式不同。

例子:

CREATE OR REPLACE FUNCTION public.generate_syllables()
  RETURNS integer AS
$BODY$

DECLARE
w RECORD;
s RECORD;
current_syllable integer := 1;
vowel_trigger integer := 0;
syllable_count integer := 1;

BEGIN

FOR w IN SELECT id FROM words LOOP
    FOR s IN SELECT sound, id FROM sounds WHERE id = w.id ORDER BY ordering LOOP
        IF (SELECT sr.vowel FROM sound_reference sr WHERE sr.sound = s.sound) = 1 AND vowel_trigger = 1 THEN
            syllable_count := syllable_count + 1;
            UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
            vowel_trigger := 0;
        ELSIF (SELECT sr.vowel FROM sound_reference sr WHERE sr.sound = s.sound) = 1 THEN
            vowel_trigger := 1;
            UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
        ELSE
            UPDATE sounds SET syllable = syllable_count WHERE id = s.id;
        END IF;
    END LOOP;
    UPDATE words SET syllables = syllable_count WHERE id = w.id;
    syllable_count := 1;
    vowel_trigger := 0;

END LOOP;

RETURN 1;

END;

$BODY$
  LANGUAGE plpgsql VOLATILE

当我按原样运行这个函数时,函数永远不会进入 if 语句中的第一个条件。我通过在第一个条件中添加一个 return 语句来测试它。起初我认为这一定是一个逻辑错误,但我已经用我的数据集生成的示例手动检查了它,它应该可以按预期工作。更奇怪的是,当我注释掉外循环中的行时,对于 vowel_trigger := 0,它确实进入了第一个 if 语句。当然,逻辑也不能正常工作,据我所知,在嵌套循环完成循环之前,syllable_count 被设置回 0,这也可以解释为什么永远不会输入第一个条件,因为设置了 vowel_trigger在循环使其回到第一个条件之前回到 0。

换句话说,在我看来,我的嵌套循环并不像嵌套循环,而是嵌套循环在嵌套循环重新启动之前延伸到外部循环。我想我一定是不明白如何正确地创建一个嵌套循环,或者它们可能无法在 POSTGRESQL 中以这种方式工作...任何建议将不胜感激。

最佳答案

您还没有提供表结构和 - 更重要的是 - 数据。虽然您的函数的行为实际上取决于表 wordssoundssound_reference 中的数据。例如,如果 sound_reference 为空,vowel_trigger 永远不会是 1,因此第一个 IF 变得不可实现.

这将有助于调试您的函数:

RAISE NOTICE 'printlining helps to debug! vowel_trigger=%, syllable_count=%',
  vowel_trigger, syllable_count;

作为旁注,我注意到 UPDATE sounds SET syllable = syllable_count WHERE id = s.id; 在所有 if/else 情况下都会重复,因此可能值得移动它在它们外面并放在内部 END LOOP; 之前。

添加:

...when I comment out the line in the outer loop, for vowel_trigger := 0, then it DOES enter the first if statement.

它告诉我们,其中一个内循环的执行以 vowel_trigger 为 1 结束,它会允许第一个 IF 触发,但就在内循环之外把它变成 0,所以第一个 IF 就不起作用了。

关于postgresql - postgresql 中的嵌套循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44731857/

相关文章:

Ruby Sequel : Array returned by query is being returned as a String object, 不是数组对象

Postgresql:创建表时 UNION ALL 比 UNION 慢?

c++ - C++ 中整数循环和迭代器循环之间的差异

javascript - 如何使用 Javascript 输出带有变量插值的多行 HTML?

javascript - Django 模板变量在脚本标签中无法识别,但在常规 h1 标签中可识别。是什么原因造成的?

java - jOOQ : compare uuid(from postgresql) and string(user id in class)

javascript - 多维javascript数组中的for循环

java - 我该如何解决这个程序

javascript - Aptana3 重命名文件中的变量

postgresql - Odoo 12 编码 latin1 无法解析