由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.
我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.
LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?
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) …
我试图通过两个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 …
我有一个 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 ×4
sql ×2
arrays ×1
casting ×1
cross-join ×1
lateral ×1
lateral-join ×1
null ×1
subquery ×1
unnest ×1