0

表架构:

create table test_table
(
    id serial not null,
    data jsonb
);

样本数据:

INSERT INTO public.test_table (id, data) VALUES (1, '[{"": "VALUE1", "KEY2": "VALUE2"}, {"KEY1": "VALUE3", "KEY3": "VALUE4"}]');
INSERT INTO public.test_table (id, data) VALUES (2, '[{"''KEY1 ''": "VALUE1", "KEY2": "VALUE2"}, {"KEY3": "VALUE3", "KEY4": "VALUE4"}]');

SQL查询:

SELECT id, arr_elem
    FROM test_table AS tt, jsonb_array_elements(
        (
          SELECT data
          FROM test_table
          WHERE id = tt.id
        )
    ) AS arr_elem
    WHERE arr_elem#>'{KEY1}' IS NOT NULL

我想调整到上述查询以匹配以下场景:

  1. 查找带有空字符串的键:例如:"": "VALUE1"
  2. 只用单引号查找键:例如:"''": "VALUE1"
  3. 查找尾随空格用单引号括起来的键:例如:"'KEY1 '": "VALUE1"

试图转义引号和空格,但查询未返回预期结果。

更新 1:

1的解决方案: http ://sqlfiddle.com/#!17/6d431/20

SELECT id, arr_elem
    FROM test_table AS tt, jsonb_array_elements(
        (
          SELECT data
          FROM test_table
          WHERE id = tt.id
        )
    ) AS arr_elem
    WHERE arr_elem->'' IS NOT NULL
4

2 回答 2

1
 select * from test_table
 where data->'' is not null /*gets rows with blank key names;


 select * from test_table
 where data->'''''' is not null; /*gets rows with '' as a key name;

最后一个有点复杂...

 select * from test_table
 where exists 
 (select * from json_each(data) where key != rtrim(key))

过去的一个得到任何键的行!= rtrim(key),所以应该得到键名中带有尾随空格的项目。

于 2017-09-29T20:02:44.860 回答
0

另一个更适合您拥有的 json“对象数组”的答案:

 select * from test_table
  where exists 
  (select * from jsonb_array_elements(data)
    where exists 
      (select * from 
        (select  jsonb_object_keys as k from 
          jsonb_object_keys(jsonb_array_elements)
        ) x 
        where x.k ='' or x.k ='''''' or x.k like '% '''
      )
  );

注意:最里面的(选择 json_object_keys as k...)实际上在语法上不应该是必需的,但我永远不能让它作为一个较小的“一个衬里”工作。

此外,此查询一次选择所有 3 个条件。您可以通过调整 where 子句的 3 个“或”部分轻松调整它以清除这些场景或一次完成一个场景......

说明:您必须首先使用 jsonb_array_elements 将数据列扩展为一个对象数组以获取每个对象,然后将这些对象中的每一个都扩展为一个键数组,然后可以将其作为普通文本进行搜索。

于 2018-09-05T19:14:27.097 回答