我有一个查询,如:
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 对象。我想避免这种情况并保留原始列名。
我有一个VIEW
我正在尝试为其创建进化脚本的地方,因此我可以向其中添加一列。那部分工作正常;列添加就好了。但是,反过来不起作用;删除最后添加的列失败并显示一条ERROR: cannot drop columns from view
消息。问题是这个特定的视图有很多引用,从和到,因此我不能只是DROP CASCADE
该死的东西!
是否有原因我无法从给定中删除新添加的列VIEW
?那么,我该怎么做才能完成这个任务呢?
(注意:这里的情况就是它们的样子,但我可以很好地看到类似的情况,也就是在许多其他情况下从视图中删除列。)
对于一个项目,我创建了一个带有列的表price MONEY NOT NULL
。而且我认为它会正确处理小数,与浮点数(即 IEEE 舍入问题)不同,但我最终$9.94
从数据库返回了像(字符串)这样的值,而不是9.94
(数字)。必须通过删除美元符号来手动操作字段值是愚蠢的;有没有办法让一MONEY
列没有货币符号?
如果不是,处理货币价值的最佳数据类型替换是什么?
是否可以将 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) 像这样的查询
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)
执行时,c
和b
将彼此相乘并在 JSON 数组对象中产生重复的条目。
我尝试将查询更改为使用 2 个子查询,但出现各种错误和警告,例如“子查询必须只返回一列”等。
我也尝试使用LEFT OUTER JOIN
,但我想我还没有掌握连接表的工作原理,因为它仅适用于b
并且c
仍然相乘并包含重复项。
编辑:DISTINCT
在COALESCE
函数上使用带有“无法识别 json 类型的相等运算符”的错误。
如何修复此查询并仅聚合唯一行?
我需要指定表b
和c
实际上都是VIEW
s,而且它们都至少有一json_agg
列,所以我不能只使用json_agg(DISTINCT b.*)
. 这太容易了。
这是一个重现问题的小片段:
--DROP TABLE …
Run Code Online (Sandbox Code Playgroud) 我以前曾经这样做过,但在我盲目地重复一些我认为是黑客的事情之前,我在这里问一下。
我有 3 个表(为了清楚起见,省略了详细信息):
id bigserial (PK)
sku character varying(24)
name character varying(32)
...
Run Code Online (Sandbox Code Playgroud)
id bigserial (PK)
name cahracter varying(32)
...
Run Code Online (Sandbox Code Playgroud)
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 的内容,但它没有解决从其中删除元素时的情况数组(即删除关联)。
我有一个表,其目的是存储应用程序的各种图像。它是这样定义的:
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.id
的102
和104 …
我正在处理的应用程序根据状态和日期(按该顺序)显示一些任务。但是,对于特定状态,排序条件应该颠倒。例如,一个看起来像这样的表:
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) (抱歉标题含糊,如果有人想重新编辑,请做我的客人!)
我有工厂库存模块的这些表和视图:
+----------------------------+ +--------------------------+
| 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)