标签: jsonb

Postgres中JSON和JSONB之间的区别

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

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

postgresql json sqldatatypes jsonb

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

如何在JSON Postgres数据类型列中搜索特定字符串?

我有一个params名为reports包含JSON 的表中的列.

我需要在JSON数组中的任何位置找到哪些行包含文本'authVar'.我不知道文本出现的路径或级别.

我想用标准的操作符搜索JSON.

就像是:

SELECT * FROM reports
WHERE params LIKE '%authVar%'
Run Code Online (Sandbox Code Playgroud)

我搜索并搜索了Postgres文档.我不太了解JSON数据类型,并且我错过了一些简单的东西.

JSON看起来像这样.

[  
   {  
      "tileId":18811,
      "Params":{  
         "data":[  
            {  
               "name":"Week Ending",
               "color":"#27B5E1",
               "report":"report1",
               "locations":{  
                  "c1":0,
                  "c2":0,
                  "r1":"authVar",
                  "r2":66
               }
            }
         ]
      }
   }
]
Run Code Online (Sandbox Code Playgroud)

postgresql json jsonb

13
推荐指数
1
解决办法
6538
查看次数

查询 json / jsonb 列超级慢。我可以使用索引吗?

我正在尝试加快对 PostgreSQL 数据库中存储的一些 json 数据的查询速度。我继承了一个应用程序,该应用程序查询一个名为 的 PostgreSQL 表,该data表带有一个名为 的字段value,其中值是类型为 json 的 blob jsonb

它大约有 300 行,但从 5 个 json 元素中选择此数据需要 12 秒。json blob 有点大,但我需要的数据都在 json 嵌套的顶层(如果有帮助的话)。

我尝试添加索引,CREATE INDEX idx_tbl_data ON data USING gin (value);但这没有帮助。我应该使用不同的索引吗?长期愿景是重写应用程序以将数据移出 json,但由于应用程序其他部分的复杂性,这至少需要 30-40 个工作日的工作,所以我想看看是否可以可以在短期内加快速度。

不确定它是否有帮助,但构成此结果集的基础数据不会经常更改。经常发生变化的是 json blob 中更下方的数据。

SELECT
  value::json ->> 'name' AS name,
  value::json ->> 'mnemonic' AS mnemonic,
  value::json ->> 'urlName' AS "urlName",
  value::json ->> 'countryCode' AS "countryCode",
  value::json #>>'{team}' AS team
FROM
  data;
Run Code Online (Sandbox Code Playgroud)

postgresql json postgresql-performance jsonb

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

PostgreSQL - jsonb_each

我刚刚开始在postgres上玩jsonb并找到难以在网上找到的例子,因为它是一个相对较新的概念.我正在尝试使用jsonb_each_text打印出一个键和值表,但在一个列中得到一个csv.

我将以下json保存为jsonb并使用它来测试我的查询.

{
  "lookup_id": "730fca0c-2984-4d5c-8fab-2a9aa2144534",
  "service_type": "XXX",
  "metadata": "sampledata2",
  "matrix": [
    {
        "payment_selection": "type",
        "offer_currencies": [
            {
              "currency_code": "EUR",
              "value": 1220.42
            }
        ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我可以访问offer_currencies数组

SELECT element -> 'offer_currencies' -> 0
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element
WHERE element ->> 'payment_selection' = 'type'
Run Code Online (Sandbox Code Playgroud)

给出"{"值":1220.42,"currency_code":"EUR"}"的结果,所以如果我运行以下查询我得到(我必须更改"for")

select * from jsonb_each_text('{"value": 1220.42, "currency_code": "EUR"}')

Key            | Value
---------------|----------
"value"        | "1220.42"
"currency_code"| "EUR"
Run Code Online (Sandbox Code Playgroud)

所以使用上面的理论我创建了这个查询

SELECT jsonb_each_text(data)
FROM (SELECT element -> 'offer_currencies' -> 0 AS data
  FROM test t, jsonb_array_elements(t.json …
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

12
推荐指数
1
解决办法
6878
查看次数

具有参数化查询的jsonb存在运算符

......或问号问题.

我目前正在使用新的jsonb类型在php中实现postgres数据库的搜索功能.

为了实现这一点,我正在使用命名占位符执行预准备语句.

然而,在尝试使用一些新的postgres JSON包含和存在运算符以及命名占位符时,我遇到了一个有趣的问题.

问题的基础是运营商自己使用问号?作为其语法的一部分.即

? 密钥/元素字符串是否存在于JSON值中?

?| 是否存在任何这些键/元素字符串?

?& 是否存在所有这些键/元素字符串?

这意味着我在PHP中的语句如下所示.

$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta ? :value");
$sth->bindValue(1, $value, PDO::PARAM_STR);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

这会失败,因为问号被解释为占位符.为了解决这个问题,我试图让运算符本身成为一个命名参数.

$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta :operator :value");
$sth->bindValue(1, $operator, PDO::PARAM_STR);
$sth->bindValue(2, $value, PDO::PARAM_STR);
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

然而,这只会抛出与使用裸操作符相同的错误,即

ERROR: syntax error at or near \"$1\"1

有没有其他人遇到过这个问题,或者有人能想到一个好的解决方法吗?

有没有办法逃脱或传递问号,以便可以使用postgres jsonb包含和存在运算符与PDO参数化查询?

php postgresql json pdo jsonb

12
推荐指数
1
解决办法
2137
查看次数

在jsonb字段上添加索引

我需要在Postgres中搜索jsonb字段的数组键的值.

field: {'array_key' : [1, 2, 3, 4]}
Run Code Online (Sandbox Code Playgroud)

是否可以添加索引array_key或是否有任何优化方法来搜索值?

搜索查询会是这样的

select * where field['array_key'].include?(2)
Run Code Online (Sandbox Code Playgroud)

postgresql indexing ruby-on-rails jsonb

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

从JSONB字段中展平聚合的键/值对?

我在Postgres 9.4中使用下表:

     Column      ?         Type         ? Modifiers
???????????????????????????????????????????????????????????????
 id              ? integer              ? not null default
 practice_id     ? character varying(6) ? not null
 date            ? date                 ? not null
 pct_id          ? character varying(3) ?
 total_list_size ? double precision     ? not null
 star_pu         ? jsonb                ?
Run Code Online (Sandbox Code Playgroud)

我有以下查询:

SELECT date,
       AVG(total_list_size) AS total_list_size,
       json_object_agg(key, val) AS star_pu
FROM (SELECT date,
             SUM(total_list_size) AS total_list_size,
             key, SUM(value::numeric) val FROM frontend_practicelist p,
             jsonb_each_text(star_pu)
       GROUP BY date, key ) p
GROUP BY date
ORDER BY date;
Run Code Online (Sandbox Code Playgroud)

它给我一个附加到JSON对象的结果 …

postgresql json jsonb postgresql-9.4

12
推荐指数
1
解决办法
4428
查看次数

如何获得PostgreSQL jsonb字段的大小?

我在表中有一个带有jsonb字段的表.

CREATE TABLE data.items
(
  id serial NOT NULL,
  datab jsonb
)
Run Code Online (Sandbox Code Playgroud)

如何在这样的查询中获取此字段的大小:

select id, size(datab) from data.items
Run Code Online (Sandbox Code Playgroud)

postgresql jsonb

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

PostgreSQL 的 WHERE 子句中不允许使用集合返回函数

我正在尝试在 2 个不同表中的 2 个 jsonb 数组之间进行连接。链接它们的 id 位于数组内部。

这是我尝试过的,我在 postgres 上创建了一个函数,它返回一个 Id 列表(来自表 B),我试图将它们与表 A 匹配。

TableA
ID | resultA 
1  | {records:[{id: 1, key: A, value: High}, {id: 2, key: B, value:Low}]}

TableB
ID | resultB
2  | {records:[{key: A, value: New Equipment}, {key: B, value: Old Equipment}]
Run Code Online (Sandbox Code Playgroud)

所以我得到了 SQL 来显示两个 Id 的 2 列

select elem-> 'key' as TableA_id from TableA, lateral jsonb_array_elements(resultA -> 'records') elem
where elem-> 'key' in (public.myfunction('999'))
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误: WHERE 中不允许设置返回函数

不知道这里出了什么问题。

postgresql jsonb

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

如何为jsonb密钥执行LIKE查询?

我有以下jsonb结构:

{'this': '1', 'this_that': '0', 'this_and_that': '5'}
Run Code Online (Sandbox Code Playgroud)

如何选择包含LIKE运算符的行?

SELECT * FROM myjson WHERE j ? 'this_%'
Run Code Online (Sandbox Code Playgroud)

返回0行...希望它匹配'this_that'和'this_and_that'.(注意:'_'后面的字符可能会有很大差异,因此我无法完全匹配).

postgresql json jsonb

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