【问题标题】:Combined SELECT from unnested composite type array and regular column来自未嵌套复合类型数组和常规列的组合 SELECT
【发布时间】:2014-12-16 22:37:39
【问题描述】:

我有一张桌子my_friends_cards

id | name    | rare_cards_composite[] |
---+---------+------------------------
1  | 'timmy' |  { {1923, 'baberuth'}, {1999, 'jeter'}}
2  |'jimmy'  |  { {1955, 'Joey D'}, {1995, 'juice_head'}}
3  |'bob'    |  {{2001, 'mo_jeter'}}

我想发出这样的请求:

Select name, (cards.x).player
FROM SELECT UNNEST(base_ball_card) as x
     FROM my_friends_cards
     WHERE name=ANY(['timmy', 'jimmy'])) as cards
WHERE (cards.x).year > 1990

(我知道在未嵌套的复合数组中没有“名称”字段是行不通的。)

我感觉我的复合类型数组列应该只是另一个表,然后我可以进行连接,但是这有什么办法吗?

我希望得到这样的结果:

[('timmy', 'jeter')
,('jimmy', 'juice_head')]

版本:PostgreSQL 9.3.3

【问题讨论】:

  • 能否发布您期望的结果?
  • 发布确切的表定义或确切的CREATE TABLE 脚本与问题应该是显而易见的。还有你的 Postgres 版本(总是)。
  • 感谢您的编辑 :) 对不起新用户
  • 同意应该有确切的定义和版本,但我不知道这对于不一定有“一如既往”的菜鸟来说是显而易见的;)跨度>

标签: sql arrays postgresql rowtype set-returning-functions


【解决方案1】:

您的感觉是正确的:使用另一个表而不是复合类型数组的规范化架构在许多方面都是更好的方法。

虽然坚持你不幸的设计:

测试设置

(你应该提供这个。)

CREATE TYPE card AS (year int, cardname text);

CREATE TABLE my_friends_cards (id int, name text, rare_cards_composite card[]);

INSERT INTO my_friends_cards VALUES
  (1, 'timmy', '{"(1923,baberuth)","(1999,jeter)"}')
, (2, 'jimmy', '{"(1955,Joey D)","(1995,juice_head)"}')
, (3, 'bob'  , '{"(2001,mo_jeter)"}')
;

查询

需要 Postgres 9.3+。

SELECT t.name, c.cardname
FROM   my_friends_cards t
     , unnest(t.rare_cards_composite) c
WHERE t.name = ANY('{timmy,jimmy}')
AND   c.year > 1990;

SQL Fiddle.

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 2016-06-28
    • 2017-05-14
    • 2020-10-06
    • 2023-03-06
    • 2014-04-28
    • 2020-11-09
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多