Select 在 postgresql 中查询带有列表的 jsonb 列
Select query for jsonb column with list in postgresql
我有 table 和 jsonb
列。
我需要向 select 错误列包含 LATEST_PERIOD_TOO_OLD
的所有行编写查询。但是我发现的例子只有在你有钥匙的情况下才有效。但我没有。经典 like
也不能用于 jsonb
Table:
id | errors
----+----------------------------------------------------------------
1 | ["LATEST_PERIOD_TOO_OLD"]
2 | ["LATEST_PERIOD_TOO_OLD", "DURATION_TOO_SMALL"]
3 | null
Entity class
中的字段:
@Type(type = "jsonb")
@Column(name = "errors", columnDefinition = "jsonb")
var errors: Set<ValidationError>? = null,
sql 查询是:
SELECT *
FROM your_table
WHERE jsonb_path_match(errors, '$[*] ? (exists(@ == "LATEST_PERIOD_TOO_OLD"))')
使用 @>
contains 运算符。
select * from the_table where errors @> '["LATEST_PERIOD_TOO_OLD"]';
与问题无关,但你为什么不使用规范化数据设计?
我有 table 和 jsonb
列。
我需要向 select 错误列包含 LATEST_PERIOD_TOO_OLD
的所有行编写查询。但是我发现的例子只有在你有钥匙的情况下才有效。但我没有。经典 like
也不能用于 jsonb
Table:
id | errors
----+----------------------------------------------------------------
1 | ["LATEST_PERIOD_TOO_OLD"]
2 | ["LATEST_PERIOD_TOO_OLD", "DURATION_TOO_SMALL"]
3 | null
Entity class
中的字段:
@Type(type = "jsonb")
@Column(name = "errors", columnDefinition = "jsonb")
var errors: Set<ValidationError>? = null,
sql 查询是:
SELECT *
FROM your_table
WHERE jsonb_path_match(errors, '$[*] ? (exists(@ == "LATEST_PERIOD_TOO_OLD"))')
使用 @>
contains 运算符。
select * from the_table where errors @> '["LATEST_PERIOD_TOO_OLD"]';
与问题无关,但你为什么不使用规范化数据设计?