问题标签 [postgresql-json]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2567 浏览

postgresql - UPSERT 测试代码中的语法错误

我正在尝试使用以下测试代码测试新的 PostgreSQL upsert 语法,但得到语法错误:

请问上面的代码为什么会失败?

此外,该test1表有几个约束(非负值和唯一主键)。如何仅解决唯一性约束?

更新 2:我已经从 to 切换UPDATEINSERT(对不起这个愚蠢的错误!),但我仍然在语法上苦苦挣扎:

我还尝试将 JSON 行更改为:

但这也失败了......

为方便起见,这是我的测试代码:

0 投票
1 回答
2227 浏览

json - PostgreSQL。json_object_agg() 返回文本字符串而不是 json 对象

正如这里所写,json_object_agg(name, value)返回类型是json. 同时,如果我返回json_object_agg()从存储过程返回的值:

并在另一个函数中调用它:

我无法获得JSON对象字段。我遇到:

错误:运算符不存在:文本 ->> 未知

并提出通知显示数据类型为text.

注意:数据类型文本

我试图将_getlocales()返回类型更改为jsonb,但没有任何改变:

为什么会发生这种情况?

0 投票
1 回答
11497 浏览

postgresql - 将 JSONB_ARRAY_ELEMENTS 与 WHERE ... IN 条件一起使用

在线扑克玩家可以选择购买游戏室 1 或游戏室 2 的访问权限。

他们可以因作弊而被暂时禁止。

这里上表填充了4条测试记录:

所有 4 条记录都属于同一个人 - 通过不同的社交网络(例如通过 Facebook、Twitter、Apple Game Center 等)验证了自己的身份

我正在尝试创建一个存储函数,该函数将获取数字用户 ID 列表(作为 JSON 数组)并将属于同一个人的记录合并到一条记录中 - 而不会丢失她的付款或惩罚:

不幸的是,它的使用会导致以下错误:

请帮我解决问题。

为了您的方便,这里有一个 SQL 代码要点。

0 投票
1 回答
1673 浏览

arrays - 将 JSONB_ARRAY_ELEMENTS 结果分配给 VARCHAR 数组

当尝试将JSONB_ARRAY_ELEMENTS调用的结果分配给VARCHAR 数组(供以后在SELECT ... WHERE IN (UNNEST(...))语句中使用)时,以下存储函数:

不幸的是打印错误:

所以我试图通过使用ARRAY_AGG来修复分配-

但得到语法错误:

请问如何将JSONB_ARRAY_ELEMENTS结果存储到数组中?

更新:

我听从了尼克的建议(谢谢),但现在卡在下一步:

尝试在SELECT ... WHERE IN ...语句中使用数组时:

0 投票
2 回答
2053 浏览

json - 在子选择中过滤 jsonb 结果

我正在从多个表构建分层 JSON 结果。这些只是示例,但对于本演示的目的来说应该足以理解这个想法:

测试数据:

我创建了以下功能:

执行函数book_get

产生以下结果

现在我可以用一个WHERE子句过滤数据,例如

我如何才能过滤authors?例如,等同于WHERE _b.authors.'name' = 'Arthur C. Clarke'.

我完全不知道会authors变成什么类型​​?或者是?它仍然是一个记录(数组)吗?已经是 JSON 了吗?我猜是因为我可以访问id,访问不是这样的问题吗titlepages_b.authors

访问_b.authors给了我ERROR: missing FROM-clause entry for table "authors"

使用 JSON 运算符访问_b.authors->>.._b->authors->>..给我

我记得使用GROUP BYwithHAVING子句:

但这给了我错误:

错误:无法识别 json 类型的相等运算符

为了更清楚一点:

基本上会做我需要的,这只有在索引上的作者0Arthur C. Clarke. 如果他与人合写了这本书并且他会排在第二位(索引 1),那么就不会有比赛了。所以我试图找到的是正确的扫描语法,_b.authors它恰好是一个由作者填充的 JSON 数组。它只是不接受任何尝试。据我了解@>#>仅支持JSONB. 那么如何在_b.authors针对值的任何列上进行选择时获得正确的语法。

更新 2

好的,再次阅读文档......似乎我没有从 Postgres 文档中得到关于 JSON 和 JSONB 在函数方面存在差异的部分,我认为这仅与数据类型有关。在where子句中使用诸如 etc 之to_json类的to_jsonb运算符似乎可以解决问题。@>

更新 3

@ErwinBrandstetter:有道理。LATERAL 我还不知道,很高兴知道它的存在。我掌握了 JSON/JSONB 的函数和运算符,现在对我来说很有意义。我不清楚的是在子句中找到LIKE例如出现的情况。WHERE

如果我需要jsonb_array_elements在数组中取消嵌套对象(因为在最后的WHERE子句中,内容b.authors是 JSONB 数据类型)。然后我可以做

并得到想要的结果,

WHERE但是在我的示例中,在最后(最后)子句中实现这一目标的方法是什么?指出最后一个WHERE子句,因为我想过滤完整的结果集,而不是在子选择中间的某个地方部分过滤。所以总的来说,我想在最终结果集中过滤掉作者中间名为“C”的书籍。或名字“亚瑟”。

更新 4

当然是在FROM条款中。当我找出所有可能性时,我将不得不在最后进行性能调整,但这就是我想出的。

将给出作者姓名以“亚瑟”开头的所有书籍。我仍然感谢对这种方法的评论或更新。

0 投票
3 回答
144 浏览

python - 这个 SQL 语句有 django ORM 版本吗?

使用 Django 1.9 和 Postgres 9.4。

我有一个名为 .jsonb 的字段json_fieldjson_field可以包含title看起来像'the cow jumped over the moon'.

所以我想搜索title包含的行moon

它使用以下原始 SQL 正常工作

SELECT * FROM web_file where (json_field ->> 'title')::text LIKE '%moon%';

但我宁愿使用 Django ORM。

编辑:

我想尝试(正如@kloddant 所指出的那样)

但它给出了以下错误

这是相关的models.py

这可能是 django 模型和 MPTTModel 之间的冲突,尽管我对此表示怀疑?

0 投票
1 回答
299 浏览

postgresql - 在 postgresql 视图/函数中合并两个 json 对象

我在 postgress 中有以下 3 个表...

而地址组件具有类似...的数据

员工可以有多个地址,每个地址与一个地址组件相关联。

我希望将地址作为 json 并将 address_component 作为嵌入在地址对象中的另一个 json。

有了这个,我能够正确地将地址数组作为 json 获取,而我暂时将地址组件作为单独的结果。你能帮我把这个 address_component json 合并到 address json 数组的单个元素中,得到如下所示的输出吗?

0 投票
2 回答
1284 浏览

json - 更新postgres json中数组中的每个值

在我的 postgres 数据库中,我的 json 看起来类似于:

现在我想重命名myValueotherValue. 我不能确定数组的长度!最好我想使用set_jsonb通配符之类的东西作为数组索引,但这似乎不受支持。那么最好的解决方案是什么?

0 投票
1 回答
1514 浏览

postgresql - 带有查询生成器的值数组的 JSON Where 子句

data这是表列中的 JSON 值things

我可以使用这样的原始查询获取所有things包含b等于 1 的 a :

我知道我们可以使用 Laravel 使用带有 JSON where 子句的 Laravel 运行查询:https ://laravel.com/docs/5.4/queries#json-where-clauses 。我可以写如下内容:

但是我可以用 Laravel 的 Query Builder 写一个 where 来检查是否a包含{b: 1}就像在原始查询中一样吗?

0 投票
1 回答
671 浏览

postgresql - 如何从 JSON 填充嵌套复合类型并插入到表中

我正在尝试将复杂的 JSON 转换为复合类型。这是一个例子

这工作正常。

现在我试图通过首先将 JSON 数组填充到复合类型中然后将其插入来将其插入表中。PostgreSQL 函数抛出一个奇怪的错误。

这只是我分享的一个示例,实际的 JSON 是从其他几个函数生成的。所以我需要修复 JSON,然后将其作为复合类型插入到表中。真正接近但没有被插入的一个是: -

请注意我必须如何将数组转换为 PostgreSQL 喜欢的 JSON 兼容数组,但这仍然不起作用,因为存在类型转换问题。

所以,我真的想在这里解决两个问题:-

  1. 如何将 JSON 转换为 json_populate_recordset 喜欢的兼容 JSON,即复杂的 JSON 被序列化为一个类型(在我们的例子中是 ty)。

  2. 尝试转换和插入类型数组时如何解决类型转换问题。