web-dev-qa-db-ja.com

Postgresql JSONのようなクエリ

Module_dataと呼ばれる次の表があります。現在、3行のエントリがあります。

                id                               data
0ab5203b-9157-4934-8aba-1512afb0abd0 {"title":"Board of Supervisors Meeting","id":"1i3Ytw1mw98"}
7ee33a18-63da-4432-8967-bde5a44347a0 {"title":"Board of Supervisors Meeting","id":"4-dNAg2mn6o"}
8d71ca35-74eb-4751-b635-114bf04843f1 {"title":"COPD 101", "id":"l9O0jCR-sxg"}

列データのデータ型はjsonbです。 like演算子を使用してクエリしようとしています。次のようなもの:

SELECT * FROM module_data WHERE title LIKE '%Board%';

私はjsonbサポートを見てきましたが、like演算子はないようです。誰かアドバイスがあれば。

28
adviner

データ列がテキスト型の場合、キャスト時に->>を使用します。

select * from module_data where data::json->>'title' like '%Board%'

すでにjsonの場合:

select * from module_data where data->>'title' like '%Board%'
48
Gurwinder Singh

Jsonbタイプの列では次のように機能します。

select * from table_name
where 
column_name::text like '%Something%'

より多くの例と実装に関する良い記事を見つけました: https://www.compose.com/articles/faster-operations-with-the-jsonb-data-type-in​​-postgresql/

それが役に立てば幸い!

1
Deep Sehgal

このページを見つけた他の人に十分なもう1つのオプションは、列をテキストタイプにキャストすることです。例えば

select * from module_data where data::text like '%Board%'

ただし、これはjson全体を検索するため、他のフィールドが問題にならないことを保証できる場合にのみ使用してください。

1
nevster

私はそれが次のようであるべきだと思う

select * from module_data where data->>'$."title"' like '%Board%'

それは私のために働いただけです。

0
Karansing