我有 2 表公司和联系人。联系人具有地址 JSONB 列。我在contacts.linked_to_company 上尝试了一个带有join 的select 语句并使用jsonb_array_elements(company.addresses) 但我收到错误“无法从标量中提取元素”,我理解这是因为某些条目在列地址中确实有[null]。我已经看到了使用合并或 CASE 语句的答案。Coalesce 我可能无法工作,CASE 示例在 select 语句中,如何在连接中使用它?这是sql
SELECT company.id,
trading_name,
nature_of_business,
t.id contactID,
address->>'PostCode' Postcode,
position_in_company
FROM contact t FULL JOIN company ON (t.company_linked_to = company.id ),
jsonb_array_elements(t.addresses) address
WHERE
t.company_linked_to ='407381';
Run Code Online (Sandbox Code Playgroud)
这是示例 jsonb
[{"PostCode":"BN7788","Address":"South Street","AddressFull":"","Types":[{"Type":"Collection"}]}]
Run Code Online (Sandbox Code Playgroud) 我需要MM/DD/YYYY使用sequelize 将jsonb 列上的一个格式字符串与postgres 中的另一个格式字符串进行比较。
在常规专栏上我会做类似的事情
sequelize.where(sequelize.fn('date', sequelize.col('created_at'), '>=', moment().subtract(1, 'days').format('MM/DD/YYY'))),
Run Code Online (Sandbox Code Playgroud)
但是一旦该值位于 JSONB 中,我似乎找不到引用它的方法。
我尝试了多种变体:
sequelize.col("data ->> 'created_at'")
sequeliez.json("data.created_at")
Run Code Online (Sandbox Code Playgroud)
ETC...
实施这个的正确方法是什么?
运行 PostgresSQL v10.5。
在我的表中有一个类型为 的table_a列。metadatajsonb
它有一个 JSON 数组作为其键之一,array_key其值如下所示:
[{"key1":"value11", "key2":"value21", "key3":"value31"},
{"key1":"value21", "key2":"value22", "key3":"value23"}]
Run Code Online (Sandbox Code Playgroud)
这就是我查询这个密钥的方式
SELECT metadata->>'array_key' from table_a
Run Code Online (Sandbox Code Playgroud)
这给了我整个数组。有什么方法可以只查询选定的键并可能格式化它们?
数组的类型是文本,pg_typeof(metadata->>'array_key')即text
理想的输出是
"value11, value13", "value21, value23"
Run Code Online (Sandbox Code Playgroud) 我尝试设置 GIN 索引,但我认为在运行请求时没有使用我的索引,无论是使用运算符还是函数。
在我们的表中,我们有一个json_aip包含 Json的 JSONB 字段 ( ),如下所示:
{
"properties": {
"pdi": {
"contextInformation": {
"tags": ["SOME_TAG"]
},
},
}
Run Code Online (Sandbox Code Playgroud)
表创建:
create table t_aip (
json_aip jsonb,
[...]
);
CREATE INDEX idx_aip_tags
ON t_aip
USING gin ((json_aip -> 'properties' -> 'pdi' -> 'contextInformation' -> 'tags'));
Run Code Online (Sandbox Code Playgroud)
我们不能?|像使用 JDBC 一样使用运算符。但是有传言说当我运行这种类型的查询时我应该看到我的索引。
EXPLAIN ANALYZE SELECT count(*)
FROM storage.t_aip
WHERE json_aip#>'{properties,pdi,contextInformation,tags}' ?| array['SOME_TAG']
Run Code Online (Sandbox Code Playgroud)
结果:
Aggregate
(cost=27052.16..27052.17 rows=1 width=8) (actual time=488.085..488.087 rows=1 loops=1)
-> Seq Scan on t_aip (cost=0.00..27052.06 …Run Code Online (Sandbox Code Playgroud) Is there a way to get the JSON of the only modified fields?
Now I use the following trigger but the entire line is printed in the changelog.
Example tables:
TABLE tbl_changelog (
tbl TEXT,
op TEXT,
new JSON,
old JSON
);
TABLE tbl_items (
f1 TEXT,
f2 TEXT
);
Run Code Online (Sandbox Code Playgroud)
Trigger:
CREATE OR REPLACE FUNCTION changelog_procedure() RETURNS trigger AS $$
BEGIN
INSERT INTO tbl_changelog(tbl, op, new, old)
VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW), row_to_json(OLD));
RETURN NULL;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER; …Run Code Online (Sandbox Code Playgroud) 这是模型和postgres数据库中的 JSONB 数组数据类型:
.
.
.
MyField: {
type: DataTypes.ARRAY(DataTypes.JSONB),
allowNull: false
}
.
.
.
Run Code Online (Sandbox Code Playgroud)
表字段包含 JSONB 值:
{"{\"LessonId\": \"1\", \"TeacherId\": \"1\"}"}
Run Code Online (Sandbox Code Playgroud)
这是我在sequelize findAll 方法中的where 子句:
where: {
MyField: {
[Op.contains]: [
{
TeacherId: '1',
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
生成的查询是这样的:
SELECT
...
"MyField",
FROM
"MyTable" AS "MyTable"
WHERE
"MyTable"."MyField" @> ARRAY [ '{"TeacherId":"1"}' ]:: JSONB [];
Run Code Online (Sandbox Code Playgroud)
并且结果集是空的。但当我LessonId也包括在内时,它就会完成我的回答。我发现 postgres 将 jsonb 对象视为字符串文本。根据 JSONB ARRAY 中的特定键进行查询的正确方法是什么?
我想过滤带有gold徽章的行。我正在使用 PG12,并且使用它的新路径功能。
为了澄清一下,我有一个users_tbl这样的表:
CREATE TABLE users_tbl (
ID serial NOT NULL PRIMARY KEY,
data jsonb NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
让我们插入值:
INSERT INTO users_tbl (ID, data) values (1, '{"badges": ["gold", "silver"], "another_field": 1}');
INSERT INTO users_tbl (ID, data) values (2, '{"badges": ["silver"], "another_field": 3}');
INSERT INTO users_tbl (ID, data) values (3, '{"badges": ["gold"], "another_field": 4}');
Run Code Online (Sandbox Code Playgroud)
现在当我这样查询时:
SELECT
ID, jsonb_path_query("data", '$.badges') AS "badges"
FROM "users_tbl";
Run Code Online (Sandbox Code Playgroud)
我得到了预期的以下结果:
+----+--------------------+
+ ID | badges +
+----+--------------------+
+ 1 | ["gold", "silver"] + …Run Code Online (Sandbox Code Playgroud) 我已经使用 vlad mihalcea 的依赖项将 json 值存储在表中。
表名:valuation_report JsonbColumn为parameters属性名在pojo中为params
能够获取单个对象的值,例如address =“Address1”
{"address":"Address1","nestedObj":{"firstName":"Sanjay"}}
Run Code Online (Sandbox Code Playgroud)
为了获取地址,我已经实现了规范和 @Overriden Predicate 方法,例如
@Override
public Predicate toPredicate(Root<ValuationReport> root, CriteriaQuery<?> query, CriteriaBuilder cb)
{
return cb.equal(cb.function("jsonb_extract_path_text", String.class,root.<String>.get("params"),cb.literal(this.locale)), this.fieldToSearch);
}
Run Code Online (Sandbox Code Playgroud)
但现在我想找到 NestedObj 的值,就像nestedObj 的名字是 Sanjay 一样。
{"nestedObj":{"firstName":"Sanjay"}}
Run Code Online (Sandbox Code Playgroud)
请帮助我,我用手机写了所有这些,很抱歉问题格式不正确。
我正在使用 PostgreSQL。有没有办法只在字典键而不是值上创建索引 。
例如,想象一个 jsonb 列,如下所示:
select data from tablename where id = 0;
answer: {1:'v1', 2:'v2'}
Run Code Online (Sandbox Code Playgroud)
我想在键集(或键列表)上建立索引,该键集是[1, 2]. 为了加快查询速度,例如:
select count(*) from tablename where data ? '2';
Run Code Online (Sandbox Code Playgroud)
正如您在docs中看到的,有一种方法可以对列进行完全索引(键+值):
CREATE INDEX idxgin ON api USING GIN (jdoc);
Run Code Online (Sandbox Code Playgroud)
考虑到我在值中存储了大量数据,这对我来说不好。
我之前尝试过这个:
CREATE INDEX test ON tablename (jsonb_object_keys(data));
Run Code Online (Sandbox Code Playgroud)
错误是:
ERROR: set-returning functions are not allowed in index expressions
Run Code Online (Sandbox Code Playgroud)
另外,我不想将键作为值存储在字典中。
你能帮助我吗?
我有以下控制器
@RequestMapping(value = "/update/{tableId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity updateItemQty (@PathVariable Long tableId, @RequestBody AddItemsRequestBody requestBody,
HttpServletRequest request){
try {
String addedBy = getUserName(request);
Float ItemQuantity = requestBody.getItemQuantity();
LocalDateTime dateTimeAdded = LocalDateTime.now();
String subId = requestBody.getItemSubId();
ArrayList<ItemAdditionDetails> updatedAdditionDetails = new ArrayList<>();
ItemAdditionDetails newItemAdditionDetails = new ItemAdditionDetails();
newItemAdditionDetails.setIncreamentCount(ItemQuantity);
newItemAdditionDetails.setAddedDateTime(dateTimeAdded);
newItemAdditionDetails.setAddedBy(addedBy);
updatedAdditionDetails.add(newItemAdditionDetails);
// Here i am fetching a JSON-B column that returns an array of json objects from Postgress DB
ItemInventoryService.findByItemSubId(subId).getItemsInventoryAdditionDetails().forEach((el) -> {
updatedAdditionDetails.add(el);
});
itemInventoryService.updateItemsAdditionDetails(subId,updatedAdditionDetails); …Run Code Online (Sandbox Code Playgroud) jsonb ×10
postgresql ×9
json ×3
arrays ×2
indexing ×2
sequelize.js ×2
sql ×2
hibernate ×1
java ×1
jpa ×1
plpgsql ×1
spring-boot ×1