13

私は次のjsonb構造を持っています:

{'this': '1', 'this_that': '0', 'this_and_that': '5'}

LIKE 演算子を含む行を選択するにはどうすればよいですか?

SELECT * FROM myjson WHERE j ? 'this_%'

0 行を返します...「this_that」と「this_and_that」に一致することを望んでいました。(注: 「_」に続く文字は大きく異なる可能性があるため、完全に一致させることはできません)。

4

1 に答える 1

14

jsonbとの型の間に暗黙的なキャストがないため、この例は機能しませんtext。キャストを強制できます。

SELECT '{"this": 1, "this_that": 0, "this_and_that": 5}'::jsonb::text 
            like '%"this%';

それはきれいな解決策ではありません。いくつかのより良い方法は、json をアンパックし、ラテラル ジョインを使用してアンパックされたデータをフィルタリングすることです

postgres=# SELECT key FROM  myjson, lateral jsonb_each_text(j) 
             WHERE key LIKE 'this\_%';
┌───────────────┐
│      key      │
╞═══════════════╡
│ this_that     │
│ this_and_that │
└───────────────┘
(2 rows)
于 2015-05-14T04:53:59.137 に答える