'How to work with column containg array in H2 database to get n 1 row
I am new to H2 database. I have 3 tables in database for example,
table t1 :
ID | desc | something | condition_id |
---|---|---|---|
1 | EN 142868 151508 | XYZ | [4686, 4687] |
table condition
CONDITION_ID | desc | COLUMN3 |
---|---|---|
4686 | desc1 | something1 |
4687 | desc2 | something2 |
And I need output like this
ID | desc | t1something | joined Column |
---|---|---|---|
1 | EN 142868 151508 | XYZ | desc1 something1, desc2 somethin2 |
How to do this, I tried with array_contains, but its giving 2 rows as a result like' t1ID t1desc t1something joined Column 1 EN 142868 151508 XYZ desc1 something1 1 EN 142868 151508 XYZ desc2 somethin2
Please help. Thank you in advance
Solution 1:[1]
You need to group rows from table T1
and aggregate rows from table CONDITION
:
CREATE TABLE T1(ID INT, DESC VARCHAR, SOMETHING VARCHAR, CONDITION_ID INT ARRAY)
AS VALUES (1, 'EN 142868 151508', 'XYZ', ARRAY[4686, 4687]);
CREATE TABLE CONDITION(CONDITION_ID INT, DESC VARCHAR, COLUMN3 VARCHAR)
AS VALUES (4686, 'desc1', 'something1'), (4687, 'desc2', 'something2');
SELECT T1.ID, T1.DESC, T1.SOMETHING,
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ') JOINED_COLUMN
FROM T1 LEFT JOIN CONDITION ON ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
GROUP BY T1.ID, T1.DESC, T1.SOMETHING;
> ID | DESC | SOMETHING | JOINED_COLUMN
> -- | ---------------- | --------- | ----------------------------------
> 1 | EN 142868 151508 | XYZ | desc1 something1, desc2 something2
If you want to exclude rows from T1
without corresponding entries in CONDITION
, use inner JOIN
instead of LEFT JOIN
.
You may also want to add WITHIN GROUP (ODRER BY some_columns)
clause to LISTAGG
aggregate function if you need some exact order of entries:
LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
WITHIN GROUP (ORDER BY CONDITION.CONDITION_ID)
JOINED_COLUMN
Alternatively, you can use a subquery:
SELECT T1.ID, T1.DESC, T1.SOMETHING,
(
SELECT LISTAGG(CONDITION.DESC || ' ' || CONDITION.COLUMN3, ', ')
FROM CONDITION
WHERE ARRAY_CONTAINS(T1.CONDITION_ID, CONDITION.CONDITION_ID)
) JOINED_COLUMN
FROM T1;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |