Amazon redshift 在where子句中使用Json_extract_path_text()函数时出现Json解析错误

Amazon redshift 在where子句中使用Json_extract_path_text()函数时出现Json解析错误,amazon-redshift,Amazon Redshift,我有一个红移表,其中包含带有json对象的列。我在尝试对这个表执行查询时遇到了json解析器故障,该表对json对象内容应用了特定的过滤器。 虽然我能够在select语句中使用json_extract_path_text(),但在where子句中使用时同样会失败 以下是我看到的错误: Amazon无效操作:JSON解析错误 当我查看STL_错误表了解更多详细信息时,这是我在错误详细信息中看到的: 错误代码:8001 上下文:JSON解析错误 错误:无效的json对象null 下面是一个json列

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

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

当我查看STL_错误表了解更多详细信息时,这是我在错误详细信息中看到的: 错误代码: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';
这里是否有我使用错误或遗漏的内容


另外,我有另一个具有类似模式的表,同样的查询在这个表上运行得很好。这两个表之间的唯一区别是加载数据的方式-一个在复制选项中使用jsonpath文件,另一个使用json'auto'这是如果
table\u with_json\u data
包含
col\u with_json\u obj
的值为四个字符的字符串“null”

为了避免这样的错误,我建议创建一个红移UDF来验证JSON。在中描述的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;

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

谢谢Jason。。是的,我注意到很少有行具有字符串值“null”,并且必须显式地过滤掉它们。。然而,我仍然不明白的是,为什么它在“select”语句中工作,而不是在where子句中工作。确切地说,我在where子句中的条件应该过滤掉该列字符串为“null”的行。@Hercules我也有过同样的困惑和挫折。AWS红移论坛上有一个问题,您可以关注,但目前还没有回复: