Oracle SQL选择查询比较2列

时间:2020-02-15 21:28:34

标签: sql oracle

我有一个包含两列的表:

USERNAME    EMAIL_ADDRESS
------------------------------
username1   username1@abc.com
username2   username2@abc.com
username3   username3@abc.com

第一列是用户名,第二列是<username>,其中包含电子邮件域。

如何使用Oracle SQL比较这两列,以查看在email_address列中是否没有电子邮件地址格式对应的正确用户名的任何行?

3 个答案:

答案 0 :(得分:0)

是否找到在电子邮件地址格式中email_address列中没有正确的相应用户名的行?

大概是您想要的:

select t.*
from mytable t
where t.email_address not like t.username || '%'

这将返回所有email_address不以username开头的记录。

您可以尝试使用以下表达式匹配整个用户名:

where t.email_address not like t.username || '@%'

答案 1 :(得分:0)

鉴于您提供的数据,您可以使用正则表达式解析您的电子邮件地址,然后将USER_NAME与电子邮件中的用户名进行比较:

WITH cteData(USER_NAME, EMAIL_ADDRESS) AS
       (SELECT 'username1', 'username1@abc.com' FROM DUAL UNION ALL
        SELECT 'username2', 'username2@abc.com' FROM DUAL UNION ALL
        SELECT 'usernameX', 'username3@xyz.com' FROM DUAL UNION ALL
        SELECT 'username4', 'username4@abc.com' FROM DUAL),
     cteEmails AS
       (SELECT um.USER_NAME,
               REGEXP_SUBSTR(um.EMAIL_ADDRESS, '[^@.]+', 1, 1) AS EMAIL_USER_NAME,
               REGEXP_SUBSTR(um.EMAIL_ADDRESS, '[^@.]+', 1, 2) AS EMAIL_COMPANY,
               REGEXP_SUBSTR(um.EMAIL_ADDRESS, '[^@.]+', 1, 3) AS EMAIL_DOMAIN
          FROM cteData um)
SELECT *
  FROM cteEmails
  WHERE USER_NAME <> EMAIL_USER_NAME

返回

USER_NAME   EMAIL_USER_NAME EMAIL_COMPANY   EMAIL_DOMAIN
usernameX   username3       xyz             com

跑步时。

db<>fiddle here

答案 2 :(得分:0)

您可以使用正则表达式

SELECT * FROM your_table where username_col != REGEXP_SUBSTR(email_col, '([^@]+)')

//regex ([^@]+) matches any string before @ character

示例db fiddle example

WITH  da(usr, eml) AS
       (SELECT 'username1', 'username1@abc.com' FROM DUAL UNION ALL
        SELECT 'username2', 'username2@abc.com' FROM DUAL UNION ALL
        SELECT 'username_odd', 'username3@abc.com' FROM DUAL UNION ALL
        SELECT 'username4', 'username4@abc.com' FROM DUAL)
SELECT * FROM da  where usr != REGEXP_SUBSTR(eml, '([^@]+)')