不同的sql查询

不同的sql查询,sql,Sql,我有一个简单的表格,只有名字和电子邮件,叫做name\u email 我正在尝试从中提取数据,以便: 如果两行名称相同,但其中一行的电子邮件以“@yahoo.com”结尾,而另一行的电子邮件不同,则应丢弃带有“@yahoo.com”电子邮件的那一行 获取此数据的最佳方法是什么?您可以使用以下方法排除无效的电子邮件地址: SELECT name, email FROM name_email WHERE email NOT LIKE '%@yahoo.com' // % symbol is a wi

我有一个简单的表格,只有名字和电子邮件,叫做name\u email

我正在尝试从中提取数据,以便: 如果两行名称相同,但其中一行的电子邮件以“@yahoo.com”结尾,而另一行的电子邮件不同,则应丢弃带有“@yahoo.com”电子邮件的那一行


获取此数据的最佳方法是什么?

您可以使用以下方法排除无效的电子邮件地址:

SELECT name, email
FROM name_email
WHERE email NOT LIKE '%@yahoo.com' // % symbol is a wildcard so joe@yahoo.com and guy@yahoo.com both match this query.
AND name = 'Joe Guy';
或者只包含有效的电子邮件地址或域:

SELECT name, email
FROM name_email
WHERE email LIKE '%@gmail.com'
AND name = 'Joe Guy';
如果您提前知道要查询的特定名称以及要排除或包含的电子邮件地址或域,则此功能非常有效

或者,如果您不在乎返回哪个电子邮件地址,但只想返回一个,您可以使用以下方式:

SELECT DISTINCT (name, email)
FROM name_email;

您可以使用类似以下内容来排除无效的电子邮件地址:

SELECT name, email
FROM name_email
WHERE email NOT LIKE '%@yahoo.com' // % symbol is a wildcard so joe@yahoo.com and guy@yahoo.com both match this query.
AND name = 'Joe Guy';
或者只包含有效的电子邮件地址或域:

SELECT name, email
FROM name_email
WHERE email LIKE '%@gmail.com'
AND name = 'Joe Guy';
如果您提前知道要查询的特定名称以及要排除或包含的电子邮件地址或域,则此功能非常有效

或者,如果您不在乎返回哪个电子邮件地址,但只想返回一个,您可以使用以下方式:

SELECT DISTINCT (name, email)
FROM name_email;
你可以

SELECT TOP 1 email
FROM name_email
WHERE name = 'Joe Guy'
ORDER BY case when email like '%yahoo.com' then 1 else 0 end
所以,按照*@yahoo.com最后一个,其他任何东西先排序,然后取第一个

编辑:对不起,误读了这个问题-你想要一个每个名字的列表,只有一封电子邮件,以及对非雅虎电子邮件的偏好。也许你可以把上面的内容和一个小组一起使用,我得重新考虑一下。

你可以这样做

SELECT TOP 1 email
FROM name_email
WHERE name = 'Joe Guy'
ORDER BY case when email like '%yahoo.com' then 1 else 0 end
所以,按照*@yahoo.com最后一个,其他任何东西先排序,然后取第一个


编辑:对不起,误读了这个问题-你想要一个每个名字的列表,只有一封电子邮件,以及对非雅虎电子邮件的偏好。可能可以将上面的内容与小组成员一起使用,我将不得不重新思考。

好吧,我不会再与那些说我不应该提倡数据库模式更改的人(是的,你知道你是谁:-)进行斗争,但我会这样做

1/如果您绝对不能更改模式,我将使用代码(数据库之外的真实过程代码或作为DBMS允许的任何语言的存储过程)来解决它

这将检查数据库中是否有非yahoo名称,如果有,则返回该名称。如果没有,它将尝试返回雅虎名称。如果两者都不存在,它将返回一个空数据集

2/如果您可以更改模式,并且希望使用SQL查询来完成这项工作,那么我会这样做。在表中创建一个名为CLASS的单独列,对于非yahoo地址,该列应设置为0,对于yahoo地址,该列应设置为1

创建insert/update触发器以检查行的每次添加或更改,并根据电子邮件地址(以什么结尾)设置类。这保证了类始终被正确设置

查询表时,请按名称和类对其排序,并仅选择第一行。这将为您提供以下首选项中的电子邮件地址:非yahoo、yahoo、空数据集

比如:

select name, email
from tbl
where name = '[name]'
order by name, class
fetch first row only;
如果您的DBMS没有与DB2“fetchfirst row only”子句等效的语句,那么您可能仍然需要编写代码来只处理一条记录

如果您希望处理所有名称,但只处理该名称所需的特定电子邮件,那么这样的程序就足够了(我对尝试以过程方式使用关系代数(如SQL)的看法相当残酷,因此我不会在这里将它们强加给您):


好吧,我不想再和那些说我不应该提倡数据库模式更改的人(是的,你知道你是谁:-)打一架,但我会这样做

1/如果您绝对不能更改模式,我将使用代码(数据库之外的真实过程代码或作为DBMS允许的任何语言的存储过程)来解决它

这将检查数据库中是否有非yahoo名称,如果有,则返回该名称。如果没有,它将尝试返回雅虎名称。如果两者都不存在,它将返回一个空数据集

2/如果您可以更改模式,并且希望使用SQL查询来完成这项工作,那么我会这样做。在表中创建一个名为CLASS的单独列,对于非yahoo地址,该列应设置为0,对于yahoo地址,该列应设置为1

创建insert/update触发器以检查行的每次添加或更改,并根据电子邮件地址(以什么结尾)设置类。这保证了类始终被正确设置

查询表时,请按名称和类对其排序,并仅选择第一行。这将为您提供以下首选项中的电子邮件地址:非yahoo、yahoo、空数据集

比如:

select name, email
from tbl
where name = '[name]'
order by name, class
fetch first row only;
如果您的DBMS没有与DB2“fetchfirst row only”子句等效的语句,那么您可能仍然需要编写代码来只处理一条记录

如果您希望处理所有名称,但只处理该名称所需的特定电子邮件,那么这样的程序就足够了(我对尝试以过程方式使用关系代数(如SQL)的看法相当残酷,因此我不会在这里将它们强加给您):


从数据库中获取所有行,不知道名称是什么(也不需要真正关心),只想让它们显示出来,如果匹配,如果电子邮件中包含@yahoo.com,则跳过匹配


这样做将获取所有行,但如果名称与另一行匹配,则仅获取记录中的一行。但是,如果有两行名称匹配,则在电子邮件中用@yahoo.com将其丢弃

从数据库中获取所有行,不知道名称是什么(也不需要真正关心),只希望它们显示出来,如果匹配,如果电子邮件中包含@yahoo.com,则跳过匹配

select ne.*
from name_email ne
where ne.email not like '%@yahoo.com' escape '\' or
    not exists(
               select 1 from name_email
               where name = ne.name and
               email not like '%@yahoo.com' escape '\'
              )
这样做会抓取所有行,但只抓取其中一行