【发布时间】:2016-12-15 00:47:16
【问题描述】:
我在表格radio responses 中有一些数据,我正在汇总如下所示:
SELECT question_id, arr FROM radio_responses;
question_id | arr
-------------+-----------------
73 | [1,0,0]
73 | [1,0,0]
73 | [0,1,0]
73 | [0,1,0]
73 | [0,1,0]
73 | [0,0,1]
73 | [0,1,0]
73 | [0,1,0]
73 | [0,0,1]
73 | [0,0,1]
73 | [1,0,0]
74 | [1,0]
74 | [0,1]
74 | [1,0]
74 | [0,1]
74 | [1,0]
74 | [0,1]
77 | [0,1]
77 | [0,1]
77 | [0,1]
我的最终目标是从每个数组中提取1 的索引。我找不到任何使用 JSON 类型的函数,但我确实发现如果我有一个 int[] 数组,我可以使用 idx() 这样做。
我尝试了各种解决方案,但它们似乎都依赖于首先取消嵌套数据,这似乎没有必要,特别是因为在此过程中会丢失信息(除非我错过了使用 WITH ORDINALITY 的东西)。
我使用的是 Postgres 9.3 版。
【问题讨论】:
-
with t(x) as (values('[1,0,0]'::json)) select position('1' in translate(x::text,'[],','')) from t; -
这适用于这种特殊情况,但它不适用于一般意义上的,因为它只查找
1字符,而不是特定值。例如,如果我的第一个条目是2010,那么它将返回 3,因为2010的第三个字符是1。没有办法将实际数据提取为数组吗? -
抱歉,我认为您的数据库设计完全错误。您不应该在这里使用 JSON 或 Array,您应该规范化您的表格。你甚至有重复。
77 | [0,1] 77 | [0,1] 77 | [0,1] -
那些是故意重复的元素,因为它们代表对问题的回答(将被计算/列表),在这种情况下,只有回答的内容及其相关的问题 ID 很重要(相关数据被存储其他地方,后来加入)。以这种格式存储它的原因是因为 JSON 可以在 Python 中非常简单地解析,而这正是服务器正在运行的。它最初嵌套在 JSON 数组的第二层,但它是通过另一个查询选择性地提取的。
标签: sql arrays json postgresql postgresql-9.3