unexst(返回数组)的子查询?

时间:2015-08-29 09:23:17

标签: sql database postgresql

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类型?

1 个答案:

答案 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中,您使用其他括号提取值,因此结果不是行而是值(在本例中为数组)。如果内部查询返回多行,则此查询将引发错误。