Json在where子句

时间:2017-03-25 20:38:25

标签: amazon-redshift

我有一个Redshift表,其中包含带有json对象的列。我尝试在此表上执行查询时遇到json解析器失败,该查询对json对象内容应用特定过滤器。 虽然我能够在select语句中使用json_extract_path_text(),但在where子句中使用时会失败。

以下是我看到的错误: Amazon无效操作:JSON解析错误;

当我查看STL_ERROR表以获取更多详细信息时,这是我在错误详细信息中看到的内容: 错误代码:8001 上下文:JSON解析错误 错误:无效的json对象null

以下是一个此类json列中的内容示例:

{"att1":"att1_val","att2":"att2_val","att3":[{"att3_sub1_1":"att3_sub1_1_val","att3_sub1_2":"att3_sub1_2_val"},{"att3_sub2_1":"att3_sub2_1_val","att3_sub2_2":"att3_sub2_2_val"}],"att4":"att4_val","att5":"att5_val"}

现在,当我运行以下查询时,它会毫无问题地执行:

select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data;

现在,当我在where子句中使用json_extract_path_text()时,它失败并出现上述错误:

select
json_extract_path_text(col_with_json_obj,'att4') as required_val
from table_with_json_data
where json_extract_path_text(col_with_json_obj,'att4') = 'att4_val';

我在这里使用不正确或丢失了什么吗?

P.S:我有另一个具有类似架构的表,相同的查询运行就好了。两个表之间的唯一区别是数据的加载方式 - 一个在复制选项中使用 jsonpaths文件,另一个使用 json' auto'

1 个答案:

答案 0 :(得分:0)

如果table_with_json_data包含col_with_json_obj的值为{4}字符串" null"。

,则会出现错误。

为了避免这样的错误,我建议创建一个Redshift UDF来验证JSON。 http://discourse.snowplowanalytics.com/t/more-robust-json-parsing-in-redshift-with-python-udfs/197中描述的is_json()方法对我来说效果很好:

create or replace function is_json(j varchar(max))
  returns boolean
  stable as $$
    import json
    try:
      json_object = json.loads(j)
    except ValueError, e:
      return False
    return True
  $$ language plpythonu;

然后,您可以在查询中添加and where is_json(col_with_json_obj)子句,并且可以完全避免此类错误。