PostgreSQL json配列内で条件を満たしている値を取得する

PostgreSQL json配列内で条件を満たしている値を取得する

PostgreSQLで、json配列内で条件を満たしている値を取得する手順を記述してます。「jsonb_path_query」に条件を指定することで可能です。jsonデータにも使用することができます。

環境

  • OS CentOS Stream release 9
  • PostgreSQL 15.1
  • pgadmin4 6.16

json配列内で条件を満たしている値を取得

json配列内で条件を満たしている値を取得するには、「jsonb_path_query」を使用します。

jsonb_path_query(json配列,条件);

※条件に一致する値がなければ「null」が返ります。

実際に、実行してみます。

SELECT 
	jsonb_path_query('[1, 2, 3, 4, 5]', '$[*] ? (@ > 3)'),
	jsonb_path_query('[1, 2, 3, 4, 5]', '$[*] ? (@ > 5)');

実行結果をみると、取得されていることが確認できます。

以下のように複数条件を指定することも可能です。

SELECT 
	jsonb_path_query('[1, 2, 3, 4, 5]', '$[*] ? (@ > 3 && @ < 5)'),
	jsonb_path_query('[1, 2, 3, 4, 5]', '$[*] ? (@ > 2 && @ < 6)');

実行結果

変数にjsonを使用

変数に「json」データを使用することも可能です。

SELECT 
	jsonb_path_query('
		[1, 2, 3, 4, 5]', '$[*] ? (@ > $x && @ < $y)',
    	'{"x": 2, "y": 4}'),
	jsonb_path_query('
		[1, 2, 3, 4, 5]', '$[*] ? (@ > $x && @ < $y)',
		'{"x": 2, "y": 6}');

実行結果

jsonデータ

jsonデータに対しても使用することは可能です。

SELECT 
	jsonb_path_query('{"x": 1, "y": 2, "z": 3}', '$.* ? (@ > 1)'),
	jsonb_path_query('{"x": 1, "y": 2, "z": 3}', '$.* ? (@ > 5)');

実行結果

結果を配列で取得

結果を配列として取得したい場合は「jsonb_path_query_array」を使用します。

SELECT 
	jsonb_path_query_array('[1, 2, 3, 4, 5]', '$[*] ? (@ > 3)'),
	jsonb_path_query_array('[1, 2, 3, 4, 5]', '$[*] ? (@ > 5)');

実行結果