Sql 如何检查电子邮件是否已授权
我在构建应用程序中使用的SSM的SQL查询时遇到问题 情况描述:如果电子邮件被授权发送电子邮件,则结果是返回T 范围: a如果出现以下情况,则查询将返回T: 邮件不是特定于域的,即其域不在表:域中 邮件是一个域,即其域位于表:域中,邮件位于表:授权域中 b如果电子邮件是域,但不在表:AUTHORIZED\u domain中,则查询不应返回任何内容 上述表格: 域-包含作为检查模式的域 如: 授权域-包含特定于域的特定电子邮件。 我当前的查询工作不正常:Sql 如何检查电子邮件是否已授权,sql,sql-server,Sql,Sql Server,我在构建应用程序中使用的SSM的SQL查询时遇到问题 情况描述:如果电子邮件被授权发送电子邮件,则结果是返回T 范围: a如果出现以下情况,则查询将返回T: 邮件不是特定于域的,即其域不在表:域中 邮件是一个域,即其域位于表:域中,邮件位于表:授权域中 b如果电子邮件是域,但不在表:AUTHORIZED\u domain中,则查询不应返回任何内容 上述表格: 域-包含作为检查模式的域 如: 授权域-包含特定于域的特定电子邮件。 我当前的查询工作不正常: select top 1 case whe
select top 1 case
when UPPER('john.smith1@test1.com') like Concat('%',C_DOMAIN_NAME) then
case when (UPPER(C_EMAIL_ADDRESS) = UPPER('john.smith1@test1.com')) then 'T' END
else
'T'
END
as aaa
FROM DOMAINS, AUTHORIZED_DOMAIN
电子邮件是一个域,它在表:DOMAINS中,但不在表:AUTHORIZED\u domain中,并且查询返回T无论如何,它应该不返回任何内容。
我做错了什么
编辑:
这两个表相互独立,上面列出了每一列
table DOMAINS has column: C_DOMAIN_NAME
table AUTHORIZED_DOMAIN has column: C_EMAIL_ADDRESS
这似乎能满足你的需要
drop table if exists domains;
drop table if exists authorized_domain;
create table domains ( C_DOMAIN_NAME varchar(100));
create table authorized_domain (C_EMAIL_ADDRESS varchar(100));
insert into domains values ('test.com'),('test2.com'),('test3.com');
insert into authorized_domain values
('angela@test.com'),
('bert@test2.com'),
('boris@test2.com'),
('claudia@test3.com'),
('dirk@test4.com'),
('edward@example.com');
select * from domains;
select * from authorized_domain;
DECLARE @testemail varchar(100) = 'boris@test2.com';
SELECT 'T' as aaa
FROM authorized_domain
LEFT JOIN DOMAINS ON C_EMAIL_ADDRESS like CONCAT('%',C_DOMAIN_NAME)
LEFT JOIN (
select name, domain
from (
select
value as name,
lead(value) over (order by x.x) as domain
from (select row_number() over (order by value) x, value from string_split(@testemail,'@')) x
) y where not name is null and not domain is null
) z ON C_EMAIL_ADDRESS = concat(z.name,'@',z.domain)
where C_EMAIL_ADDRESS = @testemail
;
输入电子邮件地址,即'boris@test2.com使用以下SQL在其名称和域`中拆分:
DECLARE @testemail varchar(100) = 'boras@test2.com';
select name, domain
from (
select
value as name,
lead(value) over (order by x.x) as domain
from (select row_number() over (order by value) x, value from string_split(@testemail,'@')) x
) y where not name is null and not domain is null
哪些产出:
名称
领域
鲍里斯
test2.com
请为表域和授权域添加complete,因为当他们开始对此问题发表评论时,任何人都不应猜测它们是如何定义的。@Luuk I编辑的问题。Evolve-任何人都不应使用,但如果电子邮件不是域,它应该始终返回“T”-并使用您的查询和更改boris@test2.com到boris@test5.com'domain test5.com不可用,它应返回'T'-您的查询不以这种方式工作,因为它不返回任何内容。它不返回任何内容,因为b。如果电子邮件是域,但不在表中,则查询应不返回任何内容:授权域。和boris@test5.com不在AUTHORIZED_DOMAIN中?b点如果电子邮件是域,则查询应不返回任何内容。应添加:so在表域中,但它不在表中:AUTHORIZED_DOMAIN中。-和boris@test5.com域:test5.com不在域表中-因此,如果:邮件不是域特定的,则查询将返回T,即其域不在表中:domains.added第二次尝试。。。是的,它正在工作。我试着自己解决这个问题,我想知道你对这个解决方案的看法:从授权域中选择top 1'T'作为aaa,其中UPPERC\u EMAIL\u ADDRESS=UPPER'test@test.com'或不存在从上一个'test@test.com“像Concat“%”,C_域名?
DECLARE @testemail varchar(100) = 'boras@test2.com';
select name, domain
from (
select
value as name,
lead(value) over (order by x.x) as domain
from (select row_number() over (order by value) x, value from string_split(@testemail,'@')) x
) y where not name is null and not domain is null