小编Wil*_*ard的帖子

在已打开的事务中是否仍然可以使用已删除(或更改)的功能?

我发现

但是没有答案并且与我的问题不完全相同(尽管非常相似)。


假设我执行以下操作:

  1. 创建函数 myfunc()
  2. 从客户端 A 开始事务
  3. 从客户端 B 开始事务
  4. 在事务B中,使用“创建或替换功能”修改定义 myfunc()
  5. 提交事务 B
  6. myfunc()从事务 A调用

第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?


如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)


关于这个的文档在哪里?

postgresql locked-objects transaction functions

7
推荐指数
2
解决办法
206
查看次数

Postgres FROM 子句中的列别名?

我正在阅读 Postgres 文档和 SELECT 语句页面,并且遇到了我从未遇到过的别名方面。

关于 FROM 子句的部分,副标题alias 中,有一句话说明:

如果编写了别名,还可以编写列别名列表来为表的一列或多列提供替代名称。

我能找到的文档中没有给出示例。

我知道如何将输出名称设置为别名,但这似乎不是一回事。


SELECT 的概要包括以下几行:

... SELECT [ ALL | DISTINCT [ ON (expression[, ...] ) ] ] * |expression[ [ AS ]output_name] [, ...] [ FROMfrom_item[, ...] ] ...

并定义from_item为:

其中 from_item 可以是以下之一:

[ ONLY ]table_name[ * ] [ [ AS ]alias[ (column_alias[, ...] ) ] ] (select) …

postgresql alias

5
推荐指数
1
解决办法
3020
查看次数

按重叠数组分组,可传递,无重复

我发现:

但是,我无法将其用于我的案例。

我有一个像这样的表(实际myid值是散列,但为了说明在这里简化了):

create temp table a (myid text, ip inet);
insert into a (myid, ip)
values
  ('0a', '10.10.1.1'),
  ('0a', '10.10.1.2'),
  ('0a', '10.10.1.3'),
  ('0b', '10.10.1.2'),
  ('0b', '10.10.1.4'),
  ('0c', '10.10.1.5'),
  ('0d', '10.10.1.3'),
  ('0e', '10.10.1.6'),
  ('0e', '10.10.1.7'),
  ('0f', '10.10.1.8'),
  ('0f', '10.10.1.9'),
  ('10', '10.10.1.9'),
  ('11', '10.10.1.10'),
  ('12', '10.10.1.11'),
  ('12', '10.10.1.4'),
  ('1a', '10.10.1.2'),
  ('1a', '10.10.1.4'),
  ('1e', '10.10.1.11'),
  ('1f', '10.10.1.12'),
  ('23', '10.10.1.12');
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何产生的结果是:

         ids         |                         ips
---------------------+------------------------------------------------------
 {0a,0b,0d,12,1a,1e} | {10.10.1.1,10.10.1.2,10.10.1.3,10.10.1.4,10.10.1.11}
 {0c}                | {10.10.1.5}
 {0e}                | {10.10.1.6,10.10.1.7}
 {0f,10}             | {10.10.1.8,10.10.1.9}
 {11}                | …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate array recursive

5
推荐指数
1
解决办法
96
查看次数

通过基于传入的数组进行过滤,允许来自 plpgsql 函数的动态结果集?

我想我已经避免了这里的 XY 问题,因为我正在为真正的潜在问题(以动态方式总结多个表)列出我的解决方案,而且我只询问我卡住的最后一个部分。因此,首先有一些背景知识。我提供了一个最小的示例数据集,以及用于以我描述的方式汇总数据的工作代码。


考虑如下设置:

create temp table tbl1 (id int primary key, category text, passing boolean);

insert into tbl1 values
(1, 'A', 't'),
(2, 'A', 't'),
(3, 'A', 't'),
(4, 'A', 'f'),
(5, 'B', 't'),
(6, 'B', 'f'),
(7, 'C', 't'),
(8, 'C', 't'),
(9, 'C', 'f'),
(10, 'C', 'f'),
(11, 'C', 'f'),
(12, 'C', 'f'),
(13, 'B', 't'),
(14, 'B', 'f'),
(15, 'B', 't'),
(16, 'B', 'f'),
(17, 'B', 't'),
(18, 'B', 'f'),
(19, 'B', 't'),
(20, …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate plpgsql array postgresql-10

5
推荐指数
1
解决办法
66
查看次数

显示一个字段中具有非唯一值的行

我熟悉如何聚合行,如这个答案所示:

我还熟悉如何使用 HAVING 子句过滤聚合结果。

我似乎无法理解(因此它会粘住)是如何根据值或比较其他行来过滤行,而不聚合它们。

我知道答案涉及一些有关窗口函数或窗口子句的内容,事实上我以前已经成功完成过。但我似乎并没有记住它是如何运作的;我觉得我错过了一些基本的东西。

举个例子,信息如下:

 fruit_name | some_field 
------------+------------
 apple      |       3.25
 apple      |        6.8
 apple      |        0.7
 orange     |        2.6
 banana     |        3.5
 banana     |       2.49
 cherry     |          1
 grapefruit |        2.6
 grapefruit |        2.7
Run Code Online (Sandbox Code Playgroud)

我想要获取行数(按水果名称)大于 1 的所有行,因此它应该如下所示:

 fruit_name | some_field 
------------+------------
 apple      |       3.25
 apple      |        6.8
 apple      |        0.7
 banana     |        3.5
 banana     |       2.49
 grapefruit |        2.6
 grapefruit |        2.7
Run Code Online (Sandbox Code Playgroud)

执行此操作的正确惯用方法是什么?

(如果可能的话,我想要一个 SQL 标准答案,如果有一种更简单的 Postgres 特定方法来做到这一点,我也想知道。)

postgresql select window-functions

3
推荐指数
1
解决办法
1855
查看次数