Reputation: 19
Given below tables, check if either columns in Table 1 exists in Table 2 -
Table_1:
FULL_NAME |
---|
Crystal, Crystal |
Carmen, TEST2 |
XYZ, ABC |
BLA, VVV |
Table_2:
NAME |
---|
Crystal |
Carmen |
ZZZ |
AAA |
VVV |
Output:
FULL_NAME | STATUS |
---|---|
Crystal, Crystal | TRUE |
Carmen, TEST2 | TRUE |
XYZ, ABC | FALSE |
BLA, VVV | TRUE |
Upvotes: 1
Views: 166
Reputation: 1862
--Suported on MSSQL, MSACCESS, Oracle, MySQL, PostgreeSQL
SELECT t1.FULL_NAME,
CASE
WHEN Temp.CONTAINING IS NULL THEN 'FALSE'
WHEN Temp.CONTAINING IS NOT NULL THEN 'TRUE'
END AS 'STATUS'
FROM Table_1 t1
LEFT JOIN
(SELECT NAME,
(SELECT FULL_NAME
FROM Table_1
WHERE FULL_NAME LIKE CONCAT('%',NAME,'%')) as 'CONTAINING'
FROM Table_2) Temp ON
t1.FULL_NAME = Temp.CONTAINING
Upvotes: 1
Reputation: 71471
You can use exists
with instr
:
select t1.full_name, exists (select 1 from table_2 t2 where instr(t1.full_name, t2.name) > 0) status from table_1 t1;
Output:
full_name | status |
---|---|
Crystal, Crystal | 1 |
Carmen, TEST2 | 1 |
XYZ, ABC | 0 |
BLA, VVV | 1 |
Edit: the solution above will match any occurrence of substrings, however, if you want the match to be based solely on the comma separated values, you can use a recursive cte to get the substrings:
with recursive vals(id, n) as (select row_number() over (order by (select 1)), t.* from table_1 t),
cte(id, v, r) as (
select id, case when instr(n, ", ") > 0 then substr(n, 1, instr(n, ", ")-1) else n end, case when instr(n, ", ") > 0 then substr(n, instr(n, ", ")+2, length(n) - instr(n, ", ")) else "" end from vals
union all
select id, case when instr(r, ", ") > 0 then substr(r, 1, instr(r, ", ")-1) else r end, case when instr(r, ", ") > 0 then substr(r, instr(r, ", ")+2, length(r) - instr(r, ", ")-1) else "" end from cte where length(r) > 0
)
select s1.n, s3.c from (select s.id, max(s.v in (select * from table_2)) c from cte s group by s.id) s3 join vals s1 on s3.id = s1.id;
See demo.
Upvotes: 1