PosgresSQL中JSON和JSONB数据类型有什么区别?
我有一个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 数据的查询速度。我继承了一个应用程序,该应用程序查询一个名为 的 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) 我刚刚开始在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) ......或问号问题.
我目前正在使用新的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参数化查询?
我需要在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) 我在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对象的结果 …
我在表中有一个带有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) 我正在尝试在 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 中不允许设置返回函数
不知道这里出了什么问题。
我有以下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'.(注意:'_'后面的字符可能会有很大差异,因此我无法完全匹配).