Postgresql:有没有办法选择所有有效的json数据类型

时间:2014-10-21 15:31:26

标签: json postgresql validation varchar

我有一张桌子:

表格

---------------------
id  | value
---------------------
1   | invalid_json
---------------------
2   | valid_json
---------------------
3   | invalid_json
---------------------

首先,值 varchar 类型并未真正声明为 json ,并且它有一些原因可以解释为什么设置它。无论如何,我的问题是关于可能性,如果可能的话。是否可以创建一个sql来只查找包含 VALID json格式数据的行,即使列数据类型是var char?

有点:

"select * from table where (condition that data is a valid json)";

2 个答案:

答案 0 :(得分:6)

a_horse_with_no_name所述,您可以编写一个函数来尝试强制转换为json并根据该操作的成功返回结果。

CREATE FUNCTION is_json(varchar) RETURNS boolean AS $$
  DECLARE
    x json;
  BEGIN
    BEGIN
      x := $1;
    EXCEPTION WHEN others THEN
      RETURN FALSE;
    END;

    RETURN TRUE;
  END;
$$ LANGUAGE plpgsql IMMUTABLE;

使它成为IMMUTABLE会使它对重复的字符串(例如空字符串)快速运行,但它在很大程度上取决于表的大小。

然后您可以查询您的数据。

SELECT * FROM table WHERE is_json(value);

如果表很大并且您将要重复该查询很多次,我会在表中添加一个额外的is_json布尔字段。然后创建一个触发器/规则来检查该表上INSERT/UPDATE的有效性。

但是,在同一列中使用混合数据类型并不是一个好主意,请注意在您考虑这种情况时更改数据结构。

答案 1 :(得分:1)

我最近通过简单检查大括号的字符串来解决了类似的问题:

WHERE value LIKE '{%}'

这当然取决于您期望的数据,并且不会匹配 all 有效的JSON,也不会排除所有 non -JSON。在我的情况下,我有一个用来的字段,它使用一个简单的字符串(仍然存在于旧记录中),但是现在使用一个用花括号括起来的JSON对象。如果您的案件像我的案件一样-您知道有效数据和无效数据的某些细节-您可能会这样做。