我有一个带有JSON列的PostgreSQL表,我正在尝试获取该列中所有不同键的列表.我创建了一个查询来执行此操作:
SELECT DISTINCT json_object_keys(j) FROM t;
Run Code Online (Sandbox Code Playgroud)
t表在哪里,j是JSON列.这正确地处理了一小组数据,它将列出存在的所有密钥j,而不重复它们.但是,在添加了更多数据后,它不再起作用,给出错误:
ERROR: cannot call json_object_keys on a scalar
Run Code Online (Sandbox Code Playgroud)
我不确定为什么会发生这种情况.通过一次一个地限制查询到某些行,我发现了一个导致错误的行.在那一排,j是null.但是,在调用时,调用SELECT json_object_keys(null);不会导致此错误SELECT json_object_keys(j) FROM t WHERE id=12;,并且j在此行中只是null.我不确定从哪里开始.
所以我想我的问题是可能导致这种情况的原因,我怎么能解决它或阻止它发生?
运行PostgreSQL 9.3.9
编辑:好的,我可能已经预先发布了这一点.我发现j在有问题的行中没有null,这是'null'::json,仅仅选择行就不清楚了.这确实令标量误差,所以现在我只需要找出一种方法来选择行,其中j是不是'null'::json.
fis*_*cks 10
我尝试过这个查询,'null'::json用这个查询过滤掉这些值:
SELECT DISTINCT json_object_keys(j) from t WHERE j <> 'null'::json;
Run Code Online (Sandbox Code Playgroud)
但是,显然没有json <> json运算符,所以我不得不将其转换为文本并进行比较.
SELECT DISTINCT json_object_keys(j) from t WHERE j::TEXT <> 'null';
Run Code Online (Sandbox Code Playgroud)
这有效!我不是Postgres专家,所以这可能不是进行此项检查的最有效方式.