相关疑难解决方法(0)

如何使用新的PostgreSQL JSON数据类型中的字段进行查询?

我正在为PostgreSQL 9.2中的新JSON函数寻找一些文档和/或示例.

具体来说,给定一系列JSON记录:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]
Run Code Online (Sandbox Code Playgroud)

如何编写SQL以按名称查找记录?

在vanilla SQL中:

SELECT * from json_data WHERE "name" = "Toby"
Run Code Online (Sandbox Code Playgroud)

官方开发手册非常稀少:

更新我

我已经汇总了详细介绍PostgreSQL 9.2目前可能实现的内容.使用一些自定义函数,可以执行以下操作:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';
Run Code Online (Sandbox Code Playgroud)

更新II

我现在已将我的JSON函数移动到他们自己的项目中:

PostSQL - 一组用于将PostgreSQL和PL/v8转换为完全令人敬畏的JSON文档存储的函数

sql postgresql json postgresql-9.2 postgresql-9.3

208
推荐指数
3
解决办法
18万
查看次数

用于在JSON数组中查找元素的索引

我有一个看起来像这样的表:

CREATE TABLE tracks (id SERIAL, artists JSON);

INSERT INTO tracks (id, artists) 
  VALUES (1, '[{"name": "blink-182"}]');

INSERT INTO tracks (id, artists) 
  VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');
Run Code Online (Sandbox Code Playgroud)

还有其他几个与此问题无关的列.将它们存储为JSON是有原因的.

我要做的是查找具有特定艺术家姓名(完全匹配)的曲目.

我正在使用此查询:

SELECT * FROM tracks 
  WHERE 'ARTIST NAME' IN
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

例如

SELECT * FROM tracks
  WHERE 'The Dirty Heads' IN 
    (SELECT value->>'name' FROM json_array_elements(artists))
Run Code Online (Sandbox Code Playgroud)

但是,这会进行全表扫描,并且速度不是很快.我尝试使用函数创建GIN索引names_as_array(artists)并使用'ARTIST NAME' = ANY names_as_array(artists),但是不使用索引并且查询实际上明显更慢.

sql postgresql indexing json jsonb

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

带有元素编号的PostgreSQL unnest()

当我有一个具有分隔值的列时,我可以使用该unnest()函数:

myTable
id | elements
---+------------
1  |ab,cd,efg,hi
2  |jk,lm,no,pq
3  |rstuv,wxyz

select id, unnest(string_to_array(elements, ',')) AS elem
from myTable

id | elem
---+-----
1  | ab
1  | cd
1  | efg
1  | hi
2  | jk
...
Run Code Online (Sandbox Code Playgroud)

我如何包含元素编号?即:

id | elem | nr
---+------+---
1  | ab   | 1
1  | cd   | 2
1  | efg  | 3
1  | hi   | 4
2  | jk   | 1
...
Run Code Online (Sandbox Code Playgroud)

我想要源字符串中每个元素的原始位置.我试着窗口函数(row_number(), …

sql arrays postgresql window-functions set-returning-functions

69
推荐指数
3
解决办法
8万
查看次数

在JSON列中查询数组元素

最近升级到使用PostgreSQL 9.3.1来利用JSON功能.在我的表中,我有一个json类型的列,其结构如下:

{
   "id": "123",
   "name": "foo",
   "emails":[
      {
        "id": "123",
        "address": "somethinghere"
      },
      {
        "id": "456",
        "address": "soemthing"
      }
   ]
} 
Run Code Online (Sandbox Code Playgroud)

这只是用于问题目的的虚拟数据.

是否可以根据ID查询电子邮件数组中的特定项?
差不多:"返回id = 123的电子邮件""?

sql postgresql json lateral postgresql-9.3

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

Postgres中的GROUP BY - JSON数据类型不相等?

我在匹配表中有以下数据:

5;{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
6;{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}
Run Code Online (Sandbox Code Playgroud)

我想按名称选择表格中每个最后一个不同的团队.即我想要一个将返回的查询:

6;{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}
6;{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}
Run Code Online (Sandbox Code Playgroud)

所以每个团队从上次那个团队出现在表中.
我一直在使用以下(从这里):

WITH t AS (SELECT id, json_array_elements(match->'Teams') AS team FROM matches)
SELECT MAX(id) AS max_id, team FROM t GROUP BY team->'Name';
Run Code Online (Sandbox Code Playgroud)

但这回归:

ERROR: could not identify an equality operator for type json
SQL state: 42883
Character: 1680
Run Code Online (Sandbox Code Playgroud)

我知道Postgres 没有JSON的相等性.我只需要团队名称(字符串)的相等性,该团队中的队员不需要进行比较.

任何人都可以建议另一种方法吗?
以供参考:

SELECT id, json_array_elements(match->'Teams') AS team FROM matches
Run Code Online (Sandbox Code Playgroud)

收益:

5;"{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]}"
5;"{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}"
6;"{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]}"
6;"{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}"
Run Code Online (Sandbox Code Playgroud)

编辑:我转向text并关注这个问题,我用DISTINCT ON而不是GROUP BY.这是我的完整查询:

WITH t AS (SELECT id, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json greatest-n-per-group lateral

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

查询包含JSON对象数组的jsonb列

我使用PostgreSQL 9.5和Rails 5.我想查询jsonb下面显示的包含JSON对象数组的列,以返回包含的所有JSON数组元素{"kind":"person"}并执行计数.我使用
SQL显示在json数据下面.运行查询只返回一个空数组.

我已经尝试了这里这里建议的查询.

这就是我的jsonb数据:

   '[
        {"kind":"person", "filter_term":"56","selected_attr":"customer"},
        {"kind":"email", "filter_term":"marketer","selected_attr":"job_title"}
      ]'
Run Code Online (Sandbox Code Playgroud)

我想要一个sql查询返回:

                             data
----------------------------------------------------------------------
 '{"kind":"person", "filter_term":"56","selected_attr":"customer"}'
(1 row)
Run Code Online (Sandbox Code Playgroud)

和另一个返回数组的查询,以便我可以在我的应用程序中调用count并在其上循环以创建表单:

 data
----------------------------------------------------------------------
 '[{"kind":"person", "filter_term":"56","selected_attr":"customer"}]'
 (1 row)
Run Code Online (Sandbox Code Playgroud)

我试过这个SQL查询:

 "SELECT * FROM \"segments\" WHERE (payload @> '[{\"kind\":\"person\"}]')"
Run Code Online (Sandbox Code Playgroud)

我也试过这个查询:

  "SELECT payload FROM segments WHERE payload @> '[{\"kind\":\"person\"}]'::jsonb;"
Run Code Online (Sandbox Code Playgroud)

这是第三个查询:

 "SELECT * FROM segments s WHERE s.payload->'\"#{a}\"' @> '[{\"kind\":\"person\"}]';"
Run Code Online (Sandbox Code Playgroud)

该模型:

class Segment < ApplicationRecord
 store_accessor :payload,:kind, :filter_term, :selected_model_name, :selected_attr, :limit, :selected_operator …
Run Code Online (Sandbox Code Playgroud)

sql postgresql ruby-on-rails rails-activerecord jsonb

7
推荐指数
1
解决办法
4965
查看次数

查询 jsonb 数组的整数成员

背景:我们使用 PaperTrail 来保存我们不断变化的模型的历史。现在我想查询属于某个客户的项目。PaperTrail 可选择存储object_changes,我需要查询此字段以了解何时使用此 ID 创建或更改为此 ID。

我的表看起来像这样简化:

item_type | object_changes
----------|----------------------------------------------------------
"Item"    | {"customer_id": [null, 5], "other": [null, "change"]}
"Item"    | {"customer_id": [4, 5], "other": ["unrelated", "change"]}
"Item"    | {"customer_id": [5, 6], "other": ["asht", "asht"]}
Run Code Online (Sandbox Code Playgroud)

如何查询从 ID 5 更改为或更改为 ID 5 的元素(所以上面的所有行)?我试过:

SELECT * FROM versions WHERE object_changes->'customer_id' ? 5;
Run Code Online (Sandbox Code Playgroud)

这让我:

ERROR:  operator does not exist: jsonb ? integer
LINE 1: ...T * FROM versions WHERE object_changes->'customer_id' ? 5;
                                                                 ^
HINT:  No operator matches the given name …
Run Code Online (Sandbox Code Playgroud)

postgresql ruby-on-rails paper-trail-gem jsonb postgresql-9.6

7
推荐指数
1
解决办法
2047
查看次数

Query data inside an attribute array in a json column in Postgres 9.6

I have a table say types, which had a JSON column, say location that looks like this:

{ "attribute":[
  {
    "type": "state",
    "value": "CA"
  },
  {
    "type": "distance",
    "value": "200.00"
  } ...
  ]
  } 
Run Code Online (Sandbox Code Playgroud)

Each row in the table has the data, and all have the "type": "state" in it. I want to just extract the value of "type": "state" from every row in the table, and put it in a new column. I checked out several questions on SO, …

sql postgresql json

6
推荐指数
1
解决办法
5735
查看次数

如何从 PostgreSQL 的 json 数组中获取具有唯一编号的元素?

我有一张桌子bank_accounts

    Column     |         Type          |                                Modifiers                                | Storage  | Stats target | Description 
---------------+-----------------------+-------------------------------------------------------------------------+----------+--------------+-------------
 id            | integer               | not null default nextval('bank_accounts_id_seq'::regclass)              | plain    |              | 
 name          | character varying(50) |                                                                         | extended |              | 
 bank_accounts | jsonb                 | not null                                                                | extended |              | 
Run Code Online (Sandbox Code Playgroud)

它在jsonb列中有一些 JSON :

 id | name  |                              bank_accounts                               
----+-------+--------------------------------------------------------------------------
  1 | test1 | [{"name": "acct1", "balance": -500}, {"name": "acct2", "balance": -300}]
Run Code Online (Sandbox Code Playgroud)

我正在使用 jsonb_array_elements 获取一个用户的帐户列表:

select jsonb_array_elements(bank_accounts)->>'name' as name, jsonb_array_elements(bank_accounts)->>'balance' as balance …
Run Code Online (Sandbox Code Playgroud)

arrays postgresql json set-returning-functions jsonb

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

Postgres 9.4 jsonb数组作为表

我有一个json数组,其中包含大约1000个结构元素"oid:aaa,instance:bbb,value:ccc".

{"_id": 37637070
, "data": [{"oid": "11.5.15.1.4", "value": "1", "instance": "1.1.4"}
         , {"oid": "11.5.15.1.9", "value": "17", "instance": "1.1.4"}
         , {"oid": "12.5.15.1.5", "value": "0.0.0.0", "instance": "0"}]}
Run Code Online (Sandbox Code Playgroud)

oid并且instance每个json数组都是唯一的.如果我有权更改结构,我会将格式更改为key:value:

{"11.5.15.1.4-1.1.4":"1", "11.5.15.1.9-1.1.4": "17", "12.5.15.1.5-0": "0.0.0.0"}
Run Code Online (Sandbox Code Playgroud)

但是,如果我需要留在旧结构

  1. oid从阵列中获取特定的最快方法是什么?

  2. 什么是得到一个表的3列最快的方式oid,instancevalue.或者更好的是使用oid + instance作为列标题的数据透视表.

对于2.我尝试了以下内容,但在一张大桌子上它很慢:

select *
from (
   select a->>'oid' oid, a->>'instance' instance, a->>'value' value1, id
   from (
      select jsonb_array_elements(config#>'{data}')  a, id
      from configuration
      ) b
   ) c
where  oid = '1.3.6.1.4.1.7352.3.10.2.5.35.3' and instance = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing json jsonb

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