我有一个大型数据库,其中包含用JSON编写的分析数据。
我想过滤掉数据不正确的行:
'{"hello": "world'
'{"products": [1,2,3]}'
并且会遗漏'{"products": 1}'
我想做那样的事情:
select *
from analytics
where (is_correct_json(json::json))
and (is_array(json::json->>'products'))
我怎样才能做到这一点?
答案 0 :(得分:13)
这是另一个很好的例子,为什么从一开始就选择适当的数据类型有助于以后;)
没有内置函数来检查给定文本是否是有效的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;