【问题标题】:PostgreSQL JSONB - How to match the empty string keysPostgreSQL JSONB - 如何匹配空字符串键
【发布时间】:2017-09-29 17:51:58
【问题描述】:

表架构:

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

【问题讨论】:

    标签: postgresql postgresql-json


    【解决方案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) 所在的行,因此应该获取键名中带有尾随空格的项目。

    【讨论】:

    • 不幸的是,给定的命令都不起作用。 sqlfiddle.com/#!17/6d431/16
    • 我没有注意到它是一个数组。我必须向它添加“unnest”。基本的工作,但它们不是为数组编写的,而是为基础对象编写的。
    • @SivasubramaniamArunachalam 请查看我刚刚发布的另一个答案,根据您的确切数据应该可以工作。
    【解决方案2】:

    另一个更适合您拥有的 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 将数据列扩展为对象数组以获取每个对象,然后依次将这些对象中的每一个扩展为键数组,然后可以将其搜索为普通文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多