Postgres 错误:CASE 中不允许设置返回函数

Posted

技术标签:

【中文标题】Postgres 错误:CASE 中不允许设置返回函数【英文标题】:Postgres error : set-returning functions are not allowed in CASE 【发布时间】:2021-04-15 10:28:58 【问题描述】:

我是 SQL 的菜鸟(了解非常基础的知识)并尝试使用名为 GridKIT 的开源项目来构建通向日本的电力网络。在运行 GridKIT 时,我收到以下错误,并且不知道如何修复它。

 psql:src/electric-3-line.sql:255: ERROR:  set-returning functions are not allowed in CASE

 LINE 3:             case when voltage is not null then unnest(voltag...
                                                   ^
 HINT:  You might be able to move the set-returning function into a LATERAL FROM item.

最后一行声明将返回函数设置为 LATERAL FROM 项。任何想法如何去做?

第 248-255 行的代码,electric-3-line 供参考

 insert into line_structure (line_id, part_nr, voltage, frequency, cables, wires, num_objects, num_conflicts, num_classes)
 select line_id, generate_series(1, num_classes),
        case when voltage is not null then unnest(voltage) end,
        case when frequency is not null then unnest(frequency) end,
        case when cables is not null then unnest(cables) end,
        case when wires is not null then unnest(wires) end,
        1, array[0,0,0,0], num_classes
   from line_tags;

【问题讨论】:

请说明您真正想做的事情。样本数据和所需结果会有所帮助。 你甚至需要任何不为空检查的 case 表达式吗?简单地取消嵌套。 【参考方案1】:

你可以将逻辑表达为:

insert into line_structure (line_id, part_nr, voltage, frequency, cables, wires, num_objects, num_conflicts, num_classes)
 select line_id, generate_series(1, num_classes),
        el_voltage, el_frequency, . . .
        1, array[0,0,0,0], num_classes
   from line_tags lt left join lateral
        unnest(voltage) el_voltage
        on true left join lateral
        unnest(frequency) el_frequency left join lateral
        . . .;

这回答了您提出的问题——关于修复语法错误。如果它符合您的要求,我会感到惊讶,因为它将创建所有值的笛卡尔积。您应该提出一个问题,其中包含样本数据、期望的结果以及您想要做什么的清晰解释。

【讨论】:

或者 imantha 想要from line_tags cross join unnest(voltage, frequency, cables, wires) @a_horse_with_no_name 。 . .我将此问题视为语法错误,这就是问题所在。这修复了语法错误,尽管我怀疑这是 OP 真正想要的。如果只有 OP 提供该信息。 . .但它确实在一个新问题中要求它。 您好,感谢您的所有回答。我没有过多地使用 SQL,并希望能快速解决这个问题,但情况似乎并非如此。由于我只是使用开源项目(GridKIT)并且没有编写代码,因此我不知道代码的每个部分到底在做什么。感谢所有的答案。真的很感激

以上是关于Postgres 错误:CASE 中不允许设置返回函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Postgres 11 时,UPDATE 中不允许设置返回函数

Postgres 尝试返回我的模型中不存在的列

根据用户的不同,简单的select查询在postgres数据库中不返回结果。

Postgres INSERT 为 json 返回“无效的输入语法”

错误:PostgreSQL 中不存在列

为啥 case 语句不允许我设置将在方法中使用的变量