相关疑难解决方法(0)

LATERAL和PostgreSQL中的子查询有什么区别?

由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.

我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.

LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?

sql postgresql subquery lateral-join

119
推荐指数
5
解决办法
7万
查看次数

转换unnest()的结果时会丢失NULL emements

unnest()在扩展数组后进行转换时,我偶然发现了的异常行为。

介绍

使用unnest()有三种基本语法变体:

1)SELECT unnest('{1,NULL,4}'::int[]) AS i;
2)SELECT i FROM unnest('{2,NULL,4}'::int[]) AS i;
3)SELECT i FROM (SELECT unnest('{3,NULL,4}'::int[])) AS t(i);

它们都包括一行,NULL结果符合预期

 i
---
 1
(null)
 4
Run Code Online (Sandbox Code Playgroud)

要将数组元素转换为其他类型,可以在扩展数组后立即将元素转换为基本类型,或者在扩展之前将数组本身转换为其他数组类型。第一个变体对我来说似乎更简单或更短:

A)SELECT unnest('{4,NULL,1}'::int[])::text;
B)SELECT unnest('{4,NULL,2}'::int[]::text[]);

 i
---
 4
(null)
 1
Run Code Online (Sandbox Code Playgroud)

奇怪的行为

所有组合都可能,除了 2A)

由于某些原因,无法2)A)

SELECT * FROM unnest('{2,NULL,1}'::int[])::text;
Run Code Online (Sandbox Code Playgroud)

错误:“ ::”或附近的语法错误

我可以接受。由于某种原因未实施的罕见的极端情况。
所有其他组合都会飞,但是:

1A)SELECT unnest('{1,NULL,1}'::int[])::text AS i;
2A)SELECT i FROM unnest('{2,NULL,1}'::int[])::text AS i;
3A) …

arrays postgresql casting unnest set-returning-functions

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

select子句中多个set-returns函数的预期行为是什么?

我试图通过两个set-returns函数得到一个"交叉连接",但在某些情况下我没有得到"交叉连接",请参阅示例

行为1:当设置的长度相同时,它会逐个匹配每个集合中的项目

postgres=# SELECT generate_series(1,3), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               2 |               6
               3 |               7
(3 rows)

行为2:当设置的长度不同时,它会"交叉连接"这些集合

postgres=# SELECT generate_series(1,2), generate_series(5,7) order by 1,2;
 generate_series | generate_series 
-----------------+-----------------
               1 |               5
               1 |               6
               1 |               7
               2 |               5
               2 |               6
               2 |               7
(6 rows)

我想我在这里不了解一些事情,有人可以解释一下这种行为吗?

编辑:另一个例子,比以前更奇怪

postgres=# SELECT generate_series(1,2) x, generate_series(1,4) y order by x,y;
 x | y 
---+---
 1 | 1
 1 | 3 …

sql postgresql cross-join set-returning-functions

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

Postgres 10 横向取消嵌套缺少空值

我有一个 Postgres 表,其中文本列的内容用“|”分隔。

ID | ... | my_column
-----------------------
1  | ... | text|concatenated|as|such
2  | ... | NULL
3  | ... | NULL
Run Code Online (Sandbox Code Playgroud)

我尝试取消嵌套(string_to_array())此列以分隔行,效果很好,除了我的 NULL 值(> 90%的所有条目)被排除在外。我尝试了几种方法:

 SELECT * from "my_table", lateral unnest(CASE WHEN "this_column" is NULL
 THEN NULL else string_to_array("this_column", '|') END);
Run Code Online (Sandbox Code Playgroud)

或者

如此处建议的:PostgreSQL 用空数组取消嵌套

我得到什么:

ID | ... | my_column
-----------------------
1  | ... | text
1  | ... | concatenated
1  | ... | as
1  | ... | such
Run Code Online (Sandbox Code Playgroud)

但这就是我需要的:

ID | ... | …
Run Code Online (Sandbox Code Playgroud)

postgresql null lateral

2
推荐指数
1
解决办法
1649
查看次数