【问题标题】:SQL - Check if employee FirstName and/or LastName existsSQL - 检查员工名字和/或姓氏是否存在
【发布时间】:2021-03-05 23:49:11
【问题描述】:

根据下表,检查表 1 中的任一列是否存在于表 2 中 -

表_1:

FULL_NAME
Crystal, Crystal
Carmen, TEST2
XYZ, ABC
BLA, VVV

表_2:

NAME
Crystal
Carmen
ZZZ
AAA
VVV

输出:

FULL_NAME STATUS
Crystal, Crystal TRUE
Carmen, TEST2 TRUE
XYZ, ABC FALSE
BLA, VVV TRUE

【问题讨论】:

  • 您使用的是什么 DBMS?你在哪方面有问题?
  • @user2330382,你在下面测试我的答案吗?请这样做并与我们分享反馈。

标签: sql


【解决方案1】:

您可以将existsinstr 一起使用:

select t1.full_name, exists (select 1 from table_2 t2 where instr(t1.full_name, t2.name) > 0) status from table_1 t1;

输出:

full_name status
Crystal, Crystal 1
Carmen, TEST2 1
XYZ, ABC 0
BLA, VVV 1

编辑:上面的解决方案将匹配任何出现的子字符串,但是,如果您希望匹配仅基于逗号分隔的值,您可以使用递归 cte 来获取子字符串:

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;

demo

【讨论】:

  • 如果你为那些不知道的人添加一个解释每个函数的作用会很好。
  • 虽然这适用于示例数据,但这可能不是很好,具体取决于您要如何处理非精确匹配。例如这会将 table2 中的“Rob”与 table1 中的“Johnson, Robert”匹配。或者 table2 中的“John”和 table1 中的“Johnson, Robert”。
  • 例如,instr 无法被 SQL Server 识别。问题一般是关于 SQL 的。
【解决方案2】:
--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

【讨论】:

  • 这使用+ 作为连接操作,因此它在Oracle 中不起作用(之所以提到这一点,是因为有评论说其他答案在SQL Server 上不起作用)。这也有匹配部分名称的相同问题(可能需要也可能不需要)。
  • 请注意,@EdmCoff。我更新了我的答案,将+ 替换为CONCAT()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多