Sql 如何检查电子邮件是否已授权

Sql 如何检查电子邮件是否已授权,sql,sql-server,Sql,Sql Server,我在构建应用程序中使用的SSM的SQL查询时遇到问题 情况描述:如果电子邮件被授权发送电子邮件,则结果是返回T 范围: a如果出现以下情况,则查询将返回T: 邮件不是特定于域的,即其域不在表:域中 邮件是一个域,即其域位于表:域中,邮件位于表:授权域中 b如果电子邮件是域,但不在表:AUTHORIZED\u domain中,则查询不应返回任何内容 上述表格: 域-包含作为检查模式的域 如: 授权域-包含特定于域的特定电子邮件。 我当前的查询工作不正常: select top 1 case whe

我在构建应用程序中使用的SSM的SQL查询时遇到问题

情况描述:如果电子邮件被授权发送电子邮件,则结果是返回T

范围:

a如果出现以下情况,则查询将返回T:

邮件不是特定于域的,即其域不在表:域中

邮件是一个域,即其域位于表:域中,邮件位于表:授权域中

b如果电子邮件是域,但不在表:AUTHORIZED\u domain中,则查询不应返回任何内容

上述表格:

域-包含作为检查模式的域 如: 授权域-包含特定于域的特定电子邮件。 我当前的查询工作不正常:

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