java 用于查找包含给定字符串的json数组中的键值的Sql查询

v6ylcynt  于 2022-12-10  发布在  Java
关注(0)|答案(3)|浏览(111)

列名“备注”- json类型
列的一个单元中的数据以如下方式写入:

[
 {"text":"bbb","userID":"U001","time":16704,"showInReport":true},  
 {"text":"bb","userID":"U001","time":167047,"showInReport":true}
]

interval note column containing data
如何查找包含“bb”的关键字文本的值可以使用哪个postgersql查询来查找结果
我使用了下面的查询,它工作,但如果有人给值作为用户ID或文本,然后它显示错误的结果
我使用的是Postgres 10.20版本

select distinct(workflowid) 
from cyto_records r 
  join cyto_record_results rr on (r.recordid = rr.recordid) 
where rr.interval_note::text LIKE '%aaa%';
9gm1akwq

9gm1akwq1#

尝试使用JSON_EXTRACT

SELECT A.* FROM (    
SELECT JSON_EXTRACT(note, '$.text') as val FROM cyto_records) A
WHERE A.val = 'bb'

参考https://dev.mysql.com/doc/refman/8.0/en/json.html#json-paths

zysjyyx4

zysjyyx42#

对于Postgres版本11及更早版本,您需要迭代数组元素:

select distinct r.workflowid
from cyto_records r 
  join cyto_record_results rr on r.recordid = rr.recordid
where exists (select *
              from json_array_elements(rr.interval_note) as x(item)
              where x.item ->> 'text' like '%bb%')

如果您使用的是Postgres 12或更高版本,则可以使用JSON路径表达式:

select distinct r.workflowid
from cyto_records r 
  join cyto_record_results rr on r.recordid = rr.recordid
where rr.interval_note @@ '$[*].text like_regex "bb"'

这里假设interval_note是用推荐的类型jsonb定义的。如果不是,你需要转换它:interval_note::jsonb
与您的问题无关,但是:distinct运算符不是一个函数。用括号将后面的列括起来是无用的,不会改变distinct (a),bdistinct a,(b)distinct a,b相同
实际上,它是SELECT关键字的一个“选项”:SELECT ALLSELECT DISTINCT-类似于UNION ALLUNION DISTINCT.

t40tm48m

t40tm48m3#

我建议首先使用横向连接进行扁平化,然后执行“普通”选择。
Postgres版本前12:

select distinct workflowid
from cyto_records r 
  join cyto_record_results rr on (r.recordid = rr.recordid), 
  lateral (select j->>'text' from jsonb_array_elements(rr.interval_note) j) l(txt)
where txt ~ 'bb';

使用jsonb_path_query的Postgres版本12以上:

select distinct workflowid
from from cyto_records r 
  join cyto_record_results rr on (r.recordid = rr.recordid), 
  lateral jsonb_path_query(rr.interval_note, '$[*].text') txt
where txt::text ~ 'bb';

相关问题