Tab 1:
| id | address |
|---|---|
| 01 | Sumskoy street |
| 02 | Sumskoy passage |
| 03 | Long street |
| 04 | 1st ave |
Tab 2:
| name |
|---|
| Sumskoy |
| 1st |
I need to create a query that will return the same table with the addition of a new column with a condition met:
- if "Tab1.address" matches the "Tab2.name",
- then value is set to
1 - otherwise value is set to
0.
Expected output:
| address | new_column |
|---|---|
| Sumskoy street | 1 |
| Sumskoy passage | 1 |
| Long street | 0 |
| 1st ave | 1 |
Attempted query:
SELECT
tab1.adress,
CASE WHEN tab1.adress LIKE ('%' || tab2."name" || '%') then '1' else '0' end as New_column
FROM
tab1,
tab2
Current (wrong) output:
| address | New_column |
|---|---|
| Sumskoy street | 1 |
| Sumskoy passage | 1 |
| Long street | 0 |
| 1st ave | 0 |
| Sumskoy street | 0 |
| Sumskoy passage | 0 |
| Long street | 0 |
| 1st ave | 1 |
Can you help me with this problem?
CodePudding user response:
Just add MAX to your CASE and GROUP BY tab1.adress
SELECT
tab1.adress,
MAX(CASE WHEN tab1.adress LIKE ('%' || tab2."name" || '%') then '1' else '0' end) as New_column
FROM
tab1,
tab2
GROUP BY tab1.adress
CodePudding user response:
You can use a LEFT JOIN operation, move your condition from the SELECT statement to the JOIN condition, and use a LIKE statement to translate your condition ("if the "address" column of "tab 1" matches the "name" column from the "tab 2""). Then you can use a CASE statement to transform matches into ones and non-matches (NULL values due to left join) to zeros.
SELECT tab1.address,
CASE WHEN tab2.name IS NULL THEN 0 ELSE 1 END AS new_column
FROM tab1
LEFT JOIN tab2
ON tab1.address LIKE CONCAT('%',tab2.name,'%')
Check the demo here.
