Sql server SQL Server中的CASE语句以获取我需要的输出

Sql server SQL Server中的CASE语句以获取我需要的输出,sql-server,stored-procedures,case,Sql Server,Stored Procedures,Case,因此,我的一个朋友告诉我要检查Gmail上被“黑客”入侵的近500万个电子邮件地址 我下载了一个文本文件,里面有近500万封电子邮件(4804288封)。我想我应该在我的文本编辑器中打开它,然后按Ctrl+F组合键输入我的电子邮件地址。打开.txt文档花了很长时间,结果它崩溃了。然后我将其导出到Excel,但它的限制为100多万行。因为我在学习SQL,所以我想我将把它加载到SQL Server中,并创建一个存储过程来查询它。天气应该很凉爽 所以。。我做了什么 创建了一个名为5Mil的表 并批量插

因此,我的一个朋友告诉我要检查Gmail上被“黑客”入侵的近500万个电子邮件地址

我下载了一个文本文件,里面有近500万封电子邮件(4804288封)。我想我应该在我的文本编辑器中打开它,然后按Ctrl+F组合键输入我的电子邮件地址。打开
.txt
文档花了很长时间,结果它崩溃了。然后我将其导出到Excel,但它的限制为100多万行。因为我在学习SQL,所以我想我将把它加载到SQL Server中,并创建一个存储过程来查询它。天气应该很凉爽

所以。。我做了什么

创建了一个名为
5Mil
的表

并批量插入
.txt
文件中的信息:

BULK INSERT [dbo].[5Mil]
FROM 'C:\list\google.txt'
WITH (fieldterminator = ',', rowterminator = '@gmail.com')
GO
第一个问题,由于txt文件在每封电子邮件中有一行没有“,”结尾,我加载信息的唯一方法是使用
rowdterminator='@gmail.com'
,它截断了
'@gmail.com'
,只留下了电子邮件的用户名部分

也许有人能帮我了解如何导入信息,包括
@gmail.com

我能够导入每行1个电子邮件地址。总共4804288行

到目前为止还不错

我目前正在学习CTE,所以我想我应该把它应用到我的存储过程中

这就是我所做的

CREATE PROC googlemails
   @email VARCHAR(MAX)
AS
   WITH CTE AS
   (
      SELECT Emails
      FROM dbo.[5Mil]
      WHERE Emails LIKE '%'+@email+'%'
   )
   SELECT 
      CASE 
         WHEN Emails IS NOT NULL  
           THEN Emails
           ELSE 'you are safe'
        END AS 'Google Email'
   FROM CTE
当我运行这个过程,它发现电子邮件时,它会正确地列出它们

但是当我把一个不在列表中的电子邮件地址放进去时,我会得到

谷歌电子邮件

空白。我想要的是能够显示“您是安全的”,让用户知道您的电子邮件不是500万“黑客”的一部分

这里使用
CASE
语句的正确方法是什么。或者像往常一样通过其他方式完成这项任务。用于学习目的

多谢各位

select case when exists( select 1 from 5MIL WHERE Emails LIKE '%'+@email+'%') 
            then 'hacked' 
            else 'not hacked' end

CTE在这里不合适;它们主要用于简化大型查询和递归查询。

据我所知,您现在有一个名为5Mil的表,其中一列名为Email,每个表的用户名不带“@gmail.com”。在每个邮件后面附加“@gmail.com”是不必要的冗余。 苏呜。。。。为什么不搜索用户名部分呢?使用类似“%email%”的邮件速度慢且效率低。只在存储过程中执行此操作要简单得多(类似于dudNumber4的答案,但不要使用“LIKE”):


如果你在5Mil.Email上创建一个索引,搜索几乎是即时的。

如果你只想找到你的名字,为什么不尝试使用像这样的查找广告替换工具来查找你的名字呢。我想知道它是否能在这么大的文件上工作。如果我想显示与该查询匹配的项而不是“hacked”,该怎么办。如果用户只输入了字母“t”,它将显示hacked,但可能有数百行带有字母“t”。显示这些内容。@user3255598好的,这个答案基于您的初衷(case语句),旨在返回一个二进制结果(只有一行;两个可能的值),而不是结果集。如果您想返回所有匹配项,只需返回上面“存在”中的内容,将“1”替换为“电子邮件”。这将为您提供一个结果集,其中只有一列“Emails”(多行)。当然,这将从根本上改变你的狂欢。。。
--SET @Email = 'someusername' -- note no "@gmail.com"
if EXISTS(SELECT 1 from 5Mil where Email = @Email)
  SELECT 'Hacked'
ELSE
  SELECT "Not hacked"