我有一个JSONB字段,有时有嵌套键.例:
"a simple text"
如果我这样做,
"a simple text"
我会得到这个记录.
如何搜索嵌套密钥的存在?("a simple text")
我正在使用postgresql jdbc适配器将一堆数据迁移到jsonb字段(postgres 9.4).
导入后,日期字段看起来正确但显示为双引号.有没有办法判断它们是否实际存储在内部作为日期值?如果它们是字符串,我认为范围查找不会非常有效.
例如,propertiesjsonb字段中的条目如下所示:
"founded_on": "Sep 1, 2012 12:00:00 AM",
我现在可以搜索,比方说,
SELECT CAST(properties->>'founded_on' AS DATE
和
SELECT extract('year' from cast(properties->>'founded_on' as timestamp))
并且两者都工作正常,但不要告诉我Postgres是否每次都在jsonb字段中重新分析字符串值作为日期.
我可以创建一个索引,我将这些值转换为日期,并使用它来搜索,但它似乎有点不优雅.我真的更愿意知道存储的值是一个日期.整数和浮点数似乎是它们的实际原始值,而不是字符串,如下所示:
shares_sold": 5900000,
"latitude": 33.561467,
任何反馈都高度赞赏.
我有一个Deal模型,它具有一个名为'info'的属性,具有以下结构:
交易中的'info'栏内:
Deal1.info = [{"deal_id":"4","text1":"qqq","text2":"sqsq","image1":"sqqs","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]
# no image here inside the json
Deal2.info =
[{"deal_id":"4","text1":"qqq","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}]
Run Code Online (Sandbox Code Playgroud)
该列在移民中被定义为json
add_column :deals, :info, :json, default: '[]'
Run Code Online (Sandbox Code Playgroud)
如何在jsonb中使用活动记录查询?
查找信息包含至少一个deal_id = 4的所有交易
找到infos包含的所有交易,以及一个名为'image1'的密钥的json块({})(它应该只输出Deal1,而不是deal2)
假设我们需要检查jsonb列是否包含由任何值(非嵌套,仅第一级)中的子字符串匹配的特定值.
如何有效地优化查询以搜索值的整个JSONB列(这意味着每个键)?
是否有一些很好的替代方法可以ILIKE %val%对jsonb数据类型进行文本转换?
jsonb_each_text(jsonb_column) ILIKE '%val%'
Run Code Online (Sandbox Code Playgroud)
作为示例,请考虑以下数据:
SELECT
'{
"col1": "somevalue",
"col2": 5.5,
"col3": 2016-01-01,
"col4": "othervalue",
"col5": "yet_another_value"
}'::JSONB
Run Code Online (Sandbox Code Playgroud)
当需要%val%在包含jsonb列中不同行的不同键配置的记录中搜索模式时,您将如何优化查询?
我知道用前面和后面的%符号搜索是低效的,因此寻找更好的方法,但很难找到一个.此外,显式索引json列中的所有字段不是一个选项,因为它们对于每种类型的记录都有所不同,并且会创建一大组索引(并非每行都有相同的键集).
题
是否有更好的替代方法可以将每个键值对提取到文本并执行ILIKE/POSIX搜索?
我已经阅读了各种JSONB教程:
请考虑以下示例.
有一张叫做的桌子plans.它包含以下列:
id (整数,自动递增主键).name (串).structure (jsonb).结构列具有常规JSON对象,具有以下结构:
{
"some_unique_id": {
"key1": "valueA", // Fixed key name.
"key2": "valueB" // Fixed key name.
},
"another_unique_id": {
"key1": "valueC", // Fixed key name.
"key2": "valueB" // Fixed key name.
},
... // can go on up to a 1000 items.
}
Run Code Online (Sandbox Code Playgroud)
注意:最外面的键是动态的.他们改变了每个项目. 这些值只是常规的JSON对象.没什么特别的.
我使用UUID作为结构中的键,因此如果我知道它的UUID,它很容易查找和检索特定值.
另一个选项是使我的结构成为一个对象数组(并将UUID作为值放在每个对象中),如下所示:
[
{
"uuid": "some_unique_id",
"key1": "valueA", // Fixed key name.
"key2": "valueB" // Fixed key …Run Code Online (Sandbox Code Playgroud) 我使用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) 我有一个表'Documents',其中有一个'Tags'列,'jsonb'数据类型.标签列中的示例数据
[{"Tag": "Social Media"}, {"Tag": "Adobe Creative"}]
[{"Tag": "Interactive"}]
[{"Tag": "Web 2.0"}, {"Tag": "Adobe Creative"},{"Tag": "Suite"}]
Run Code Online (Sandbox Code Playgroud)
我需要得到"标签"的不同值
Social Media
Adobe Creative
Interactive
Web 2.0
Suite
Run Code Online (Sandbox Code Playgroud)
我是PostgreSQL的新手.
我正在阅读JHipster"创建实体",并没有看到任何与JSONB相关的字段类型.JHipster是否有任何jsonb字段类型的例子?
我是python和postgresql的新手
我一直在与使用python硬编码每个json行进行斗争,我不认为这是可扩展的方法.如果有人可以指向我可以处理从python插入json而无需硬编码的文献或文档.
我调查了COPY.
我有一个源表,如下所示:
公共源代码
Id | part_no | category
1 | 01270-4 | Landscape
2 | 01102-3 | Sports
Run Code Online (Sandbox Code Playgroud)
然后,我有带有 jsonb 列(组合)的目标表,其列表如下;
公共目标
Id | part_no | combinations
7 | 01270-4 | {"subject":""}
8 | 01102-3 | {"subject":""}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 如何使用 jsonb 列(组合)使用来自源表的值(使用 part_no 列)更新目标表?
输出如下:
Id | part_no | combinations
7 | 01270-4 | {"subject":"Landscape"}
8 | 01102-3 | {"subject":"Sports"}
Run Code Online (Sandbox Code Playgroud)
我尝试了下面但给出了错误:
UPDATE public.target t
SET combinations = jsonb_set(combinations,'{subject}','s.category',false)
FROM public.source s
WHERE s.part_no = t.part_no;
Run Code Online (Sandbox Code Playgroud)
错误:json 类型的输入语法无效第 2 行:SET 组合 = …
jsonb ×10
postgresql ×9
json ×3
python ×2
sql ×2
date ×1
jhipster ×1
lookup ×1
psycopg2 ×1
sqlalchemy ×1