选择嵌套json数组字段包含PostgreSQL中提供的数组中任何值的行?

选择嵌套json数组字段包含PostgreSQL中提供的数组中任何值的行?,sql,postgresql,plpgsql,jsonb,Sql,Postgresql,Plpgsql,Jsonb,我正在尝试编写一个sql查询,该查询将查找表中与所提供json数组的任何值匹配的行 更具体地说,我有以下db表: 创建表mytable( 名称文本, id串行主键, 配置json, 匹配布尔 ); 插入“mytable”( “名称”、“id”、“配置”、“匹配” ) 价值观 ( E‘名称1’,50, E“{“雇员”:[1,7],“行业”:[“1”、“3”、“4”、“13”、“14”、“16”],“级别”:[“1110”、“1111”、“1112”、“1113”、“1114”],“收入”:[0,

我正在尝试编写一个sql查询,该查询将查找表中与所提供json数组的任何值匹配的行

更具体地说,我有以下db表:

创建表mytable(
名称文本,
id串行主键,
配置json,
匹配布尔
);
插入“mytable”(
“名称”、“id”、“配置”、“匹配”
) 
价值观
(
E‘名称1’,50,
E“{“雇员”:[1,7],“行业”:[“1”、“3”、“4”、“13”、“14”、“16”],“级别”:[“1110”、“1111”、“1112”、“1113”、“1114”],“收入”:[0,5],“州”:[“AK”、“Al”、“AR”、“AZ”、“CA”、“CO”、“CT”、“DC”、“DE”、“FL”、“GA”、“HI”、“IA”、“ID”、“IL”],
真的
), 
(
E‘名称2’,63,
E“{”雇员“:[3,5],“行业“:[“1”],“级别“:[“1110”],“收入“:[2,5],“州“:[“AK”,“AZ”,“CA”,“CO”,“HI”,“ID”,“MT”,“NM”,“NV”,“OR”,“UT”,“WA”,“WY”],
是的,
), 
(
E'名称3',56,
E'{“雇员”:[0,0],“行业”:[“14”],“级别”:[“1111”],“收入”:[7,7],“州”:[“AK”,“AZ”,“CA”,“CO”,“HI”,“ID”,“MT”,“NM”,“NV”,“OR”,“UT”,“WA”,“WY”],
是的,
),  
(
E‘名称4’,61,
E'{“雇员”:[3,8],“行业”:[“1”],“级别”:[“1110”],“收入”:[0,5],“州”:[“AK”,“AZ”,“CA”,“CO”,“HI”,“ID”,“WA”,“WY”],
错误的
);
我需要使用给定的筛选参数对此表执行搜索查询。过滤参数基本上对应于
config
字段中的json键。它们来自客户端,可以是这样的:

{“员工”:[1,8],“行业”:[“12”,“5”]}
{“州”:[“LA”、“WA”、“CA”],“级别”:[“1100”、“1100”],“雇员”:[3]}
给定这样的过滤器,我需要在表中为提供的每个过滤器键找到包含相应过滤器键中任何数组元素的行

因此,给定过滤器
{“employees”:[1,8],“industries”:[“12”,“5”]}
查询必须返回其中的所有行(
employees
key in
config
字段包含
1
8
industries
key in
config
字段包含
12
5

我需要从javascript代码中动态生成这样一个查询,以便通过添加/删除
操作符来包含/排除特定参数的过滤

到目前为止,我得到的是一个超长时间运行的查询,它在
config
字段中生成所有可能的数组元素组合,这感觉非常错误:

从mytable中选择*
将横向json_数组_元素(配置->'employees')交叉连接为e1
将横向json_数组_元素(配置->状态)交叉连接为e2
交叉连接横向json_数组_元素(配置->'levels')作为e3
交叉连接横向json_数组_元素(配置->'revenue')作为e4;
我也尝试过这样做:

从mytable中选择*
哪里
匹配=真
和(config->'employees')::jsonb@>ANY(数组['[1,7,8]']::jsonb[])
和(config->'states')::jsonb@>ANY(数组['[“AK”,“AZ”]']::jsonb[])
及。。。。。。。。;
然而,这并没有起作用,尽管看起来很有希望

此外,我还尝试过使用
?|
操作符,但没有效果


基本上,我需要的是:在json字段中给定一个数组键,检查该字段是否包含另一个数组中提供的任何值(这是我的筛选参数);我必须动态地对多个筛选参数执行此操作

因此,逻辑如下:

select all rows from the table
   *where*
   matching = TRUE
   *and* config->key1 includes any of the keys from [5,6,8,7]
   *and* config->key2 includes any of the keys from [8,6,2]
   *and* so forth;

你能帮我实现这样一个sql查询吗


或者,这样的sql查询总是非常慢,最好在数据库级别之外进行过滤?

我会尝试这样做。我想会有一些副作用(例如,如果比较数据是空的怎么办?),我没有在更大的数据集上测试它……这只是我想到的第一个…:

连接条件的说明:

      CASE WHEN c.data -> 'levels' IS NOT NULL THEN
         ARRAY(SELECT json_array_elements_text(t.config -> 'levels')) && ARRAY(SELECT json_array_elements_text(c.data -> 'levels'))
      ELSE TRUE END
如果比较数据不包含特定属性,则条件为
true
,因此将被忽略。如果它包含属性,则通过将两个JSON数组转换为简单的Postgres数组来比较此属性的表和比较数组

      CASE WHEN c.data -> 'levels' IS NOT NULL THEN
         ARRAY(SELECT json_array_elements_text(t.config -> 'levels')) && ARRAY(SELECT json_array_elements_text(c.data -> 'levels'))
      ELSE TRUE END