PostgreSQLで文字列が有効なJSONであることを確認するにはどうすればいいですか? 質問する

PostgreSQLで文字列が有効なJSONであることを確認するにはどうすればいいですか? 質問する

JSON で記述された分析データを含む大きなデータベースがあります。

不正なデータを含む行をフィルタリングしたい:

  • 無効な JSON (一部の行には次のような内容が含まれています:'{"hello": "world'
  • いくつかの属性は配列ではないので、省略されます'{"products": [1,2,3]}''{"products": 1}'

次のようなことをしたいです:

select * 
from analytics 
where (is_correct_json(json::json)) 
and (is_array(json::json->>'products'))

どうすればそれを達成できるでしょうか?

ベストアンサー1

これは、最初から適切なデータ型を選択すると後で役立つ理由を示すもう 1 つの良い例です ;)

与えられたテキストが有効な JSON であるかどうかを確認する組み込み関数はありません。ただし、独自の関数を記述することは可能です。

create or replace function is_valid_json(p_json text)
  returns boolean
as
$$
begin
  return (p_json::json is not null);
exception 
  when others then
     return false;  
end;
$$
language plpgsql
immutable;

注意: 例外処理のため、これは高速ではありません。多数の無効な値に対してこれを呼び出すと、選択が大幅に遅くなります。

ただし、 と'{"products": 1}'はどちらも'{"products": [1,2,3]}'有効な JSON ドキュメントです。前者が無効であるという事実は、JSON 構文ではなく、アプリケーション ロジックに基づいています。

呼び出し時にエラーをトラップする同様の関数が必要であることを確認するにはjson_array_length()

create or replace function is_valid_json_array(p_json text, p_element text)
  returns boolean
as
$$
begin
  return json_array_length( p_json::json -> p_element) >= 0;
exception 
  when others then
     return false;  
end;
$$
language plpgsql
immutable;

おすすめ記事