我正在使用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,
任何反馈都高度赞赏.
假设我们需要检查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) 背景:我们使用 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)
这让我:
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 …
postgresql ruby-on-rails paper-trail-gem jsonb postgresql-9.6
我有一个包含“jsonb”类型列的表。\n在实体中,我使用属性转换器为此列设置了字符串类型:
\n\n@Convert(converter = JSONBConverter.class)\n@Column(name = STATE_COLUMN, nullable = false)\nprivate String getState() {\n return state;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的转换器看起来像:
\n\n@Converter\npublic class JSONBConverter implements AttributeConverter<String, Object> {\n @Override\n public Object convertToDatabaseColumn(String attribute) {\n PGobject result = new PGobject();\n result.setType("json");\n try {\n result.setValue(attribute);\n } catch (SQLException e) {\n throw new IllegalArgumentException("Unable to set jsonb value");\n }\n return result;\n }\n\n @Override\n public String convertToEntityAttribute(Object dbData) {\n if (dbData instanceof PGobject) {\n return ((PGobject) dbData).getValue();\n }\n return StringUtils.EMPTY;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我将方言设置为:org.hibernate.dialect.PostgreSQL95Dialect
我以为它会起作用。但我收到一个错误:
\n\n …我有一个列amount_splits,我需要按照我指定的键顺序将我的 JSON 保存到其中。
将jsonbJSON 键保存到数据库时,如何防止 Rails / Postgres自动对其进行排序?(用于创建或更新)
看起来它试图按字母顺序排序,但做得很差。
{
"str_fee": 3.17, # key 1
"eva_fee": 14.37, # key 2
"fran_royalty": 14.37, # key 3
"fran_amount": 67.09 # key 4
}
Run Code Online (Sandbox Code Playgroud)
{
"eva_fee": 14.37, # key 2
"str_fee": 3.17, # key 1
"fran_amount": 67.09, # key 4
"fran_royalty": 14.37 # key 3
}
Run Code Online (Sandbox Code Playgroud)
在您回答“在接收端消耗 JSON 时排序无关紧要”之前,请先停下来想一想……然后请继续阅读
我需要按照我需要的方式对键进行排序,因为使用此 JSON 的客户端界面正在向开发人员显示 JSON,这些开发人员需要按照文档告诉他们的顺序来显示 JSON。以及它需要的原因按照这个顺序是首先显示什么计算发生的过程:
正确的顺序告诉开发者:
首先str_fee应用 ,然后应用eva_fee,然后是fran_royalty... …
我有一个如下所示的数据库表:
---------------------------------------
| id | json_array (jsonb) |
---------------------------------------
| 1 | [{"a": 1}, {"a": 5}, {"a": 1}] |
| 2 | [{"a": 2}] |
| 3 | [{"a": 1}] |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)
我想使用 PostgreSQL 的 JSON 查询功能来选择json_array数组中的某些子字典,例如字典 where "a": 1。
输出应该是
------------------
| id | json_dict |
------------------
| 1 | {"a": 1} |
| 1 | {"a": 1} |
| 3 | {"a": 1} |
------------------
Run Code Online (Sandbox Code Playgroud)
以下查询适用于每个数组中的第一个元素,但我想检查所有元素:
---------------------------------------
| id | json_array (jsonb) |
---------------------------------------
| …Run Code Online (Sandbox Code Playgroud) 我使用 PostgreSQL 10.11 并且希望将以下结构输入 jsonb 字段:
{
lead: {
name: string,
prep: boolean
},
secondary: {
{
name: string,
prep: boolean
},
{
name: string,
prep: boolean
}
}
Run Code Online (Sandbox Code Playgroud)
因此,lead 是一个带有 name 和 prep 的对象, secondary 是一个包含 name 和 prep 的数组。我怎样才能做到这一点?下面的脚本是创建一个带有 jsonb 字段的表:
CREATE TABLE public.test01 (
name JSONB DEFAULT '{}'::jsonb NOT NULL
)
WITH (oids = false);
ALTER TABLE public.test01
ALTER COLUMN id SET STATISTICS 0;
COMMENT ON COLUMN public.test01.name
IS '''[]''';
ALTER TABLE public.test01
OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)
我正在尝试此插入但出现错误: …
我需要针对 Postgres 列触发选择查询jsonb:
entityManager.createNativeQuery(
"select * from table where jsonbcol -> 'usernames' ? :un"
).setParameter("un", userName).getResultList()
Run Code Online (Sandbox Code Playgroud)
运行时抛出异常:
org.hibernate.engine.query.ParameterRecognitionException: Mixed parameter strategies -
use just one of named, positional or JPA-ordinal strategy
Run Code Online (Sandbox Code Playgroud)
我尝试像\\?和 一样逃避??,但这没有帮助。
如何正确地进行该调用?
我需要将新的键值对添加到现有的 json 对象中。将不胜感激任何帮助。
格式:
{
"json_col": [
{
"val1": 1,
"val2": 0,
"val3": "qwe"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想出了这个查询
UPDATE table SET
json_col = jsonb_set(
json_col,
'{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400
Run Code Online (Sandbox Code Playgroud)
它会输出:
UPDATE table SET
json_col = jsonb_set(
json_col,
'{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400
Run Code Online (Sandbox Code Playgroud)
但我需要这个 json 成为单个对象(没有额外的括号),如下所示:
{
"json_col": [
{
"val1": 1,
"val2": 0,
"val3": "qwe"
},
{
"test": 123
}
]
}
Run Code Online (Sandbox Code Playgroud) jsonb ×10
postgresql ×10
json ×5
java ×2
jpa ×2
sql ×2
date ×1
hibernate ×1
lookup ×1
sql-insert ×1