相关疑难解决方法(0)

如何在Postgres 9.4中对JSONB类型的列执行更新操作

查看Postgres 9.4数据类型JSONB的文档,对我来说如何对JSONB列进行更新并不是很明显.

JSONB类型和函数的文档:

http://www.postgresql.org/docs/9.4/static/functions-json.html http://www.postgresql.org/docs/9.4/static/datatype-json.html

作为示例,我有这个基本的表结构:

CREATE TABLE test(id serial, data jsonb);
Run Code Online (Sandbox Code Playgroud)

插入很简单,如:

INSERT INTO test(data) values ('{"name": "my-name", "tags": ["tag1", "tag2"]}');
Run Code Online (Sandbox Code Playgroud)

现在,我将如何更新"数据"列?这是无效的语法:

UPDATE test SET data->'name' = 'my-other-name' WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

这个文件记录在哪里,我错过了吗?谢谢.

postgresql crud sql-update jsonb postgresql-9.4

110
推荐指数
8
解决办法
12万
查看次数

查询JSON类型中的数组元素

我正在尝试测试jsonPostgreSQL 9.3中的类型.
我在一个json名为data的表中调用了一列reports.JSON看起来像这样:

{
  "objects": [
    {"src":"foo.png"},
    {"src":"bar.png"}
  ],
  "background":"background.png"
}
Run Code Online (Sandbox Code Playgroud)

我想查询表中所有与'objects'数组中'src'值匹配的报告.例如,是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我成功写了一个可以匹配的查询"background":

SELECT data AS data FROM reports where data->>'background' = 'background.png'
Run Code Online (Sandbox Code Playgroud)

但由于"objects"有一系列的价值观,我似乎无法写出有用的东西.是否可以在数据库中查询匹配的所有报告'src' = 'foo.png'?我查看了这些来源,但仍然无法得到它:

我也尝试过这样的事情,但无济于事:

SELECT json_array_elements(data->'objects') AS data from reports
WHERE  data->>'src' = 'foo.png';
Run Code Online (Sandbox Code Playgroud)

我不是SQL专家,所以我不知道我做错了什么.

sql postgresql json lateral jsonb

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

用于在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万
查看次数

Postgres JSON数据类型Rails查询

我正在使用Postgres的json数据类型,但想要使用嵌套在json中的数据进行查询/排序.

我想在json数据类型上使用.where进行排序或查询.例如,我想查询跟随者数> 500的用户,或者我想通过关注者或跟随计数来订购.

谢谢!

例:

model User

data: {
     "photos"=>[
       {"type"=>"facebook", "type_id"=>"facebook", "type_name"=>"Facebook", "url"=>"facebook.com"}
      ], 
     "social_profiles"=>[
         {"type"=>"vimeo", "type_id"=>"vimeo", "type_name"=>"Vimeo", "url"=>"http://vimeo.com/", "username"=>"v", "id"=>"1"},
         {"bio"=>"I am not a person, but a series of plants", "followers"=>1500, "following"=>240, "type"=>"twitter", "type_id"=>"twitter", "type_name"=>"Twitter", "url"=>"http://www.twitter.com/", "username"=>"123", "id"=>"123"}
     ]
}
Run Code Online (Sandbox Code Playgroud)

postgresql json rails-postgresql psql ruby-on-rails-4

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

如何使用Java preparedStatement将JSON对象插入Postgres?

我正在努力将JSON对象插入到postgres v9.4 DB中.我已将名为"evtjson"的列定义为类型json (不是jsonb).

我试图在Java(jdk1.8)中使用预准备语句将Json对象(使用JEE javax.json库构建)插入到列中,但是我一直遇到SQLException错误.

我使用以下方法创建JSON对象:

JsonObject mbrLogRec = Json.createObjectBuilder().build();
…
mbrLogRec = Json.createObjectBuilder()
                .add("New MbrID", newId)
                .build();
Run Code Online (Sandbox Code Playgroud)

然后我将此对象作为参数传递给另一个方法,以使用预准备语句将其写入DB.(以及其他几个领域)作为:

pStmt.setObject(11, dtlRec);
Run Code Online (Sandbox Code Playgroud)

使用此方法,我收到以下错误:

org.postgresql.util.PSQLException:未安装hstore扩展.at org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:553)at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1036)

我也尝试过:

pStmt.setString(11, dtlRec.toString());
pStmt.setObject(11, dtlRec.toString());
Run Code Online (Sandbox Code Playgroud)

哪会产生不同的错误:

事件JSON:{"New MbrID":29}

SQLException:错误:列"evtjson"的类型为json,但表达式的类型为字符变化

提示:您需要重写或转换表达式.

但是,至少这告诉我DB正在将列识别为JSON类型.我确实尝试安装hstore扩展,但它告诉我它不是一个hstore对象.

OracleDocs显示了许多用于在preparedStatement中设置参数值的方法,但如果有人知道答案,我宁愿不尝试所有方法.(http://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html)这些还引用了一个额外的参数,SQLTYPE,但我不能找到这些任何引用.

我应该试试setAsciiStream吗?CharacterStream?CLOB?

java postgresql json prepared-statement

39
推荐指数
5
解决办法
4万
查看次数

在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 JSON数组中查询

您将如何搜索存储在json列中的数组中的元素? (更新:另请参阅jsonb列的9.4更新答案.)

如果我有这样的JSON文档,则存储在json名为的列中blob:

{"name": "Wolf",
 "ids": [185603363281305602,185603363289694211]}
Run Code Online (Sandbox Code Playgroud)

我希望能做的是:

SELECT * from "mytable" WHERE 185603363289694211 = ANY("blob"->'ids');
Run Code Online (Sandbox Code Playgroud)

并获取所有匹配的行.但这不起作用,因为"blob"->'ids'返回JSON值,而不是Postgres数组.

如果可能的话,我还想建立个人ID的索引.

arrays postgresql json mongodb postgresql-9.3

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

在Postgres中向JSON对象添加元素

我在数据库(postgres 9.2.1)中有一个文本字段,其中包含一个json blob.它看起来与此类似,除了所有在一行上,显然:

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要向json数组添加一个元素,使它看起来像这样:

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "something_new": {
    "checked": "1",
    "label": "Something New"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}
Run Code Online (Sandbox Code Playgroud)

我并不关心新数组元素的位置.它可以在agency_name之后.在postgres中有一个简单的方法吗?

string postgresql select json replace

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

Postgres中JSON和JSONB之间的区别

PosgresSQL中JSON和JSONB数据类型有什么区别?

  1. 什么时候应该使用具体的?
  2. 对其他人有什么好处或坏处?

postgresql json sqldatatypes jsonb

13
推荐指数
2
解决办法
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
查看次数