我有一个包含两列的表:
USERNAME EMAIL_ADDRESS
------------------------------
username1 username1@abc.com
username2 username2@abc.com
username3 username3@abc.com
第一列是用户名,第二列是<username>
,其中包含电子邮件域。
如何使用Oracle SQL比较这两列,以查看在email_address
列中是否没有电子邮件地址格式对应的正确用户名的任何行?
答案 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
跑步时。
答案 2 :(得分:0)
您可以使用正则表达式
SELECT * FROM your_table where username_col != REGEXP_SUBSTR(email_col, '([^@]+)')
//regex ([^@]+) matches any string before @ character
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, '([^@]+)')