When running this query:
SELECT id,selected_placements
FROM app_data.content_cards
I get a table like this:
+----+-------------------------------+
| id | selected_placements |
+----+-------------------------------+
| 90 | {162,108,156,80,163,155,NULL} |
+----+-------------------------------+
| 91 | {} |
+----+-------------------------------+
What I want to do now is get this same information but with the arrays splitted into rows so I get a result like this:
+----+---------------------+
| id | selected_placements |
+----+---------------------+
| 90 | 162 |
+----+---------------------+
| 90 | 108 |
+----+---------------------+
| 90 | 156 |
+----+---------------------+
| 90 | 80 |
+----+---------------------+
| 90 | 163 |
+----+---------------------+
| 90 | 155 |
+----+---------------------+
As you can see I don't want to get rows with null value in "selected_placements".
I am using PostgreSQL 8.0.2.
Many thanks!
To divide an array into two, we need at least three array variables. We shall take an array with continuous numbers and then shall store the values of it into two different variables based on even and odd values.
We access array elements using the subscript within square brackets [] . By default, PostgreSQL uses one-based numbering for array elements. It means the first array element starts with number 1.
We can use any of the string to split it; we can also use a column name as a substring to split the data from the column. Delimiter argument is used to split the string into sub-parts by using a split_part function in PostgreSQL. We can split the string into a number of parts using delimiter.
I would suggest that you upgrade your version of Postgres. All supported versions support unnest()
:
SELECT x.*
FROM (SELECT id, UNNEST(selected_placements) as selected_placement
FROM app_data.content_cards
) x
WHERE selected_placement IS NOT NULL;
In earlier versions, you can strive to pick them out one at a time. The following is tested and works, albeit in 9.5:
with content_cards as (
select 1 as id, array['a', 'b', 'c'] as selected_placements
)
SELECT id, selected_placements[num] as selected_placement
FROM (SELECT cc.*, generate_series(1, ccup.maxup) as num
FROM content_cards cc CROSS JOIN
(SELECT MAX(ARRAY_UPPER(cc.selected_placements, 1)) as maxup
FROM content_cards cc
) ccup
) x
WHERE selected_placements[num] IS NOT NULL;
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