2017-09-29 4 views
0

テーブルスキーマ:のPostgresSQL JSONB - 空の文字列のキーと一致する方法

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"

は、引用符やスペースを脱出しようとしたクエリが期待される結果が返されませんでした。

UPDATE 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 

答えて

0
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)) 

この過去1はwhere where any key!= rtrim(key)これは、キー名の末尾に空白がある項目を取得する必要があります。

+0

残念ながら、指定されたコマンドは動作しません。 http://sqlfiddle.com/#!17/6d431/16 –

+0

私はそれが配列であることに気づきませんでした。私はそれに "不必要"を追加する必要があります。基本は動作しますが、配列ではなく、ベースオブジェクト用です。 –

関連する問題