'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 | 
