当unnest
数组结果返回FROM
sub - SELECT
时,我遇到了相当不直观的行为。
SELECT unnest(c).*
FROM (SELECT chat_messages[0 : array_length(chat_messages, 1)]
FROM Chats WHERE chat_id = 2) c
这是我原来的查询。 Postgres不喜欢它:
函数unexst(记录)不存在
但这个看似相同的查询有效:
SELECT *
FROM unnest((SELECT chat_messages[0 : array_length(chat_messages, 1)]
FROM Chats WHERE chat_id = 2)) c
此查询无法使用相同的错误消息:
SELECT *
FROM (SELECT chat_messages[0 : array_length(chat_messages, 1)]
FROM Chats WHERE chat_id = 2) c,
unnest(c) u
我很确定我在这里遗漏了一些东西。为何如此行为?为什么子查询在定义复合类型时会返回record
类型?
答案 0 :(得分:2)
在第一个和第三个查询中c
正式是一组行(伪类型记录),所以你不能取消(c)。你应该使用一个值(我跳过切片不相关):
查询#1:
SELECT (unnest(val)).*
FROM (
SELECT chat_messages
FROM Chats WHERE chat_id = 2
) c(val);
-- or
SELECT (unnest(val)).*
FROM (
SELECT chat_messages val
FROM Chats WHERE chat_id = 2
) c;
查询#3:
SELECT *
FROM (
SELECT chat_messages
FROM Chats WHERE chat_id = 2
) c(val),
unnest(val) u;
-- or
SELECT *
FROM (
SELECT chat_messages val
FROM Chats WHERE chat_id = 2
) c,
unnest(val) u;
在查询#2中,您使用其他括号提取值,因此结果不是行而是值(在本例中为数组)。如果内部查询返回多行,则此查询将引发错误。