I have some data in a table radio responses I am aggregating that looks like this:
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]
My end goal is to extract the index of the 1 from each array. I could not find any functions to do so with the JSON type, but I did find that I could do so with idx() if I have an int[] array.
I have tried various solutions, but they all seem to rely on unnesting the data first, which seems unnecessary, especially since information is lost in the process (unless there's something that uses WITH ORDINALITY that I missed).
I am using Postgres version 9.3.
select *
,(select min(i) + 1
from generate_series(0,json_array_length(arr)-1) as gs (i)
where (arr->>i)::int = 1
) as ind
from radio_responses
;
+-------------+---------+-----+
| question_id | arr | ind |
+-------------+---------+-----+
| 73 | [1,0,0] | 1 |
+-------------+---------+-----+
| 73 | [1,0,0] | 1 |
+-------------+---------+-----+
| 73 | [0,1,0] | 2 |
+-------------+---------+-----+
| 73 | [0,1,0] | 2 |
+-------------+---------+-----+
| 73 | [0,1,0] | 2 |
+-------------+---------+-----+
| 73 | [0,0,1] | 3 |
+-------------+---------+-----+
| 73 | [0,1,0] | 2 |
+-------------+---------+-----+
| 73 | [0,1,0] | 2 |
+-------------+---------+-----+
| 73 | [0,0,1] | 3 |
+-------------+---------+-----+
| 73 | [0,0,1] | 3 |
+-------------+---------+-----+
| 73 | [1,0,0] | 1 |
+-------------+---------+-----+
| 74 | [1,0] | 1 |
+-------------+---------+-----+
| 74 | [0,1] | 2 |
+-------------+---------+-----+
| 74 | [1,0] | 1 |
+-------------+---------+-----+
| 74 | [0,1] | 2 |
+-------------+---------+-----+
| 74 | [1,0] | 1 |
+-------------+---------+-----+
| 74 | [0,1] | 2 |
+-------------+---------+-----+
| 77 | [0,1] | 2 |
+-------------+---------+-----+
| 77 | [0,1] | 2 |
+-------------+---------+-----+
| 77 | [0,1] | 2 |
+-------------+---------+-----+
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With