小编Yan*_*hon的帖子

选择 json_agg 中的列

我有一个查询,如:

SELECT a.id, a.name, json_agg(b.*) as "item"
  FROM a
  JOIN b ON b.item_id = a.id
 GROUP BY a.id, a.name;
Run Code Online (Sandbox Code Playgroud)

如何选择在列b,所以我没有b.item_id在JSON对象?

我读过关于ROW,但它返回一个 JSON 对象,如:

{"f1": "Foo", "f2": "Bar"}
Run Code Online (Sandbox Code Playgroud)

一旦获取它以匹配正确的列键,我将需要重新映射 JSON 对象。我想避免这种情况并保留原始列名。

postgresql group-by row json

41
推荐指数
4
解决办法
10万
查看次数

PostgreSQL:从视图中删除列

我有一个VIEW我正在尝试为其创建进化脚本的地方,因此我可以向其中添加一列。那部分工作正常;列添加就好了。但是,反过来不起作用;删除最后添加的列失败并显示一条ERROR: cannot drop columns from view消息。问题是这个特定的视图有很多引用,从和到,因此我不能只是DROP CASCADE该死的东西!

是否有原因我无法从给定中删除新添加的列VIEW?那么,我该怎么做才能完成这个任务呢?

(注意:这里的情况就是它们的样子,但我可以很好地看到类似的情况,也就是在许多其他情况下从视图中删除列。)

postgresql view postgresql-9.3

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

用于货币值的 PostgreSQL 和 MONEY 数据类型

对于一个项目,我创建了一个带有列的表price MONEY NOT NULL。而且我认为它会正确处理小数,与浮点数(即 IEEE 舍入问题)不同,但我最终$9.94从数据库返回了像(字符串)这样的值,而不是9.94(数字)。必须通过删除美元符号来手动操作字段值是愚蠢的;有没有办法让一MONEY列没有货币符号?

如果不是,处理货币价值的最佳数据类型替换是什么?

postgresql money floating-point postgresql-9.3

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

Postgres 查询以将 JSON 对象键作为数组返回

是否可以将 JSON 对象键作为 PostgreSQL 中的值数组返回?

在 JavaScript 中,这只是Object.keys(obj),它返回一个字符串数组。

例如,如果我有一张这样的表:

tbl_items
---------
id bigserial NOT NULL
obj json NOT NULL
Run Code Online (Sandbox Code Playgroud)

如果有这样的一行:

id      obj
-----   -------------------------
123     '{"foo":1,"bar":2}'
Run Code Online (Sandbox Code Playgroud)

我怎样才能有一个查询返回:

id      keys
-----   ------------------
123     '{"foo","bar"}'
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

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

删除具有两个或多个左连接表的重复行

像这样的查询

SELECT a.id, a.name,
       COALESCE( json_agg(b.*), '[]'::json ),
       COALESCE( json_agg(c.*), '[]'::json ),
  FROM a
  LEFT JOIN b ON a.id = b.a_id
  LEFT JOIN c ON a.id = c.a_id
 GROUP BY a.id, a.name;
Run Code Online (Sandbox Code Playgroud)

执行时,cb将彼此相乘并在 JSON 数组对象中产生重复的条目。

我尝试将查询更改为使用 2 个子查询,但出现各种错误和警告,例如“子查询必须只返回一列”等。

我也尝试使用LEFT OUTER JOIN,但我想我还没有掌握连接表的工作原理,因为它仅适用于b并且c仍然相乘并包含重复项。

编辑DISTINCTCOALESCE函数上使用带有“无法识别 json 类型的相等运算符”的错误。

如何修复此查询并仅聚合唯一行?


编辑 2

我需要指定表bc实际上都是VIEWs,而且它们都至少有一json_agg列,所以我不能只使用json_agg(DISTINCT b.*). 这太容易了。


编辑 3

这是一个重现问题的小片段:

--DROP TABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql join postgresql-9.4

8
推荐指数
1
解决办法
4476
查看次数

使用多个关联更新 SQL n:n 表

我以前曾经这样做过,但在我盲目地重复一些我认为是黑客的事情之前,我在这里问一下。

我有 3 个表(为了清楚起见,省略了详细信息):

库存项目

id bigserial (PK)
sku character varying(24)
name character varying(32)
...
Run Code Online (Sandbox Code Playgroud)

inv_item_groups

id bigserial (PK)
name cahracter varying(32)
...
Run Code Online (Sandbox Code Playgroud)

inv_item_group_members

item_group_id bigint (FK -> inv_item_groups)
item_id bigint (FK -> inv_items)
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码中,我有一个像这样的对象(以伪代码形式)

class ItemGroup
   id:long
   groupName:String
   items:long[]
Run Code Online (Sandbox Code Playgroud)

并且这些对象是可以修改的,然后需要更新。由于我想保留密钥完整性,因此我需要该inv_item_group_members表(否则,我会使用其他解决方案)。

现在,我通常的做法是

DELETE FROM inv_item_group_members WHERE item_group_id = $1
-- where $1 is the object's id
Run Code Online (Sandbox Code Playgroud)

的,对于items对象中的每个

INSERT INTO inv_item_group_members (item_group_id, item_id) VALUES ($1, $2)
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?有哪些替代方案?我正在考虑一个 SQL 函数,但不太确定这里最好的方法是什么(我对 PGSQL 还不太有经验。)我已经阅读过有关可写 CTE 的内容,但它没有解决从其中删除元素时的情况数组(即删除关联)。

postgresql

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

批量删除行时不要拒绝整个语句

我有一个表,其目的是存储应用程序的各种图像。它是这样定义的:

CREATE TABLE images
(
  id lo NOT NULL,
  name character varying(1024) NOT NULL,
  type character varying(32) NOT NULL,
  dimension point,
  last_modified timestamp without time zone NOT NULL DEFAULT now(),
  CONSTRAINT "PK_images" PRIMARY KEY (id)
)
Run Code Online (Sandbox Code Playgroud)

其他一些表有外键引用images.id,如果图像在某处被引用,则不应删除该约束(即应用程序负责首先正确删除引用);

...
CONSTRAINT "FK_foo_image" FOREIGN KEY (image_id)
   REFERENCES images (id) MATCH SIMPLE
   ON UPDATE CASCADE ON DELETE RESTRICT
...
Run Code Online (Sandbox Code Playgroud)

由于许多表格行可能引用相同的图像,我需要自动清理不再有任何引用的图像。

我的第一个想法是实现应用程序以删除所有外键引用,然后删除与这些已删除外键的值匹配的所有图像。为此,我会images在删除之前在表上创建一个触发器,如果仅删除“孤立”图像之类的查询而其他查询将被静默忽略,则可以“吞下”所有约束异常。我只是不确定如何正确地做到这一点。

如果这个想法不好,还有什么其他(如果不是更好的话)替代方案?

基本上,如果我正在执行这样的查询

DELETE FROM images WHERE id IN (101, 102, 103, 104, 105)
Run Code Online (Sandbox Code Playgroud)

images.id102104 …

postgresql postgresql-9.4

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

查询的自定义排序

我正在处理的应用程序根据状态和日期(按该顺序)显示一些任务。但是,对于特定状态,排序条件应该颠倒。例如,一个看起来像这样的表:

 id    | status   | planned_date
-------+----------+--------------
 1     | inactive | 2015-03-12
 2     | active   | 2015-03-13
 3     | inactive | 2015-03-13
 4     | inactive | 2015-03-14
 5     | active   | 2015-03-12
 6     | active   | 2015-03-16
 7     | active   | 2015-03-17
Run Code Online (Sandbox Code Playgroud)

应该返回为

 id    | status   | planned_date
-------+----------+--------------
 5     | active   | 2015-03-12
 2     | active   | 2015-03-13
 6     | active   | 2015-03-16
 7     | active   | 2015-03-17
 4     | inactive | 2015-03-14
 3     | inactive | 2015-03-13
 1 …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

4
推荐指数
2
解决办法
4404
查看次数

从同一个表的两个视图中选择 UNION

(抱歉标题含糊,如果有人想重新编辑,请做我的客人!)

我有工厂库存模块的这些表和视图:

+----------------------------+    +--------------------------+
| inv_items                  |    | inv_items_stock          |
+----------------------------+    +--------------------------+
| id bigserial (PK)          |    | item_id (FK) (inv_items) |
| name character varying(32) |    | qty integer              |
| is_group boolean           |    | ...                      |
| ...                        |    +--------------------------+
+----------------------------+ 

+---------------------------+     +---------------------------------+
| inv_items_group           |     | inv_items_production            |
+---------------------------+     +---------------------------------+
| group_id (FK) (inv_items) |     | item_id (FK) (inv_items)        |
| item_id (FK) (inv_items)  |     | unit_name character varying(16) |
+---------------------------+     | unit_qty number(12,4)           |
                                  +---------------------------------+

+----------------------------------+ …
Run Code Online (Sandbox Code Playgroud)

postgresql postgresql-9.3

3
推荐指数
1
解决办法
2968
查看次数