![](/img/trans.png)
[英]Oracle SQL - Compare Columns - SELECT records for values that do not have a match
[英]Oracle SQL select query compare 2 columns
我有一个包含这两列的表格:
USERNAME EMAIL_ADDRESS
------------------------------
username1 username1@abc.com
username2 username2@abc.com
username3 username3@abc.com
第一列是用户名,第二列是带有电子邮件域的<username>
。
如何使用 Oracle SQL 比较两列以查找是否有任何行的email_address
列在电子邮件地址格式中没有正确的对应用户名?
查找是否有任何行的 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 || '@%'
根据您提供的数据,您可以使用正则表达式来解析您的电子邮件地址,然后将 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
运行时。
您可以使用正则表达式
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, '([^@]+)')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.