【发布时间】:2021-12-17 20:45:02
【问题描述】:
我在 SQL 中有一个包含以下列的大表:
| CompanyId(int) | Email(Varchar 255) | First_Name(Varchar 50) | Last_Name(Varchar 50) |
|---|---|---|---|
| 1 | jim_halpert@dundermifflin.com | Jim | Halpert |
| 2 | bvance@vancerefridgerations.com | Bob | Vance |
| 1 | michael_scott@dundermifflin.com | Michael | Scott |
CompanyId 可以重复多次,因为公司附加到各种电子邮件中。
我的雇主希望我找到属于特定类型的公司电子邮件。在几个 IF 语句之后,最终结果将打印如下消息:
“CompanyId”有 firstName_lastName@companyName.domain 类型的电子邮件
“CompanyId”具有 firstInitial_lastName@companyName.domain 类型的电子邮件
我的雇主告诉我使用光标找到我的解决方案,但是一旦我启动光标,我需要检查 CompanyId 以查看该 id 是否已被循环并找到类型。如果 CompanyId 已经经历了循环,我想跳过它。
这是我目前的代码
DECLARE @CoId INT
,@Email VARCHAR(255)
,@FName varchar(50)
,@LName varchar(50)
Declare @condition bit = 1
Declare CoCursor CURSOR
For SELECT E.CompanyID, E.Email, P.First_Name, P.Last_Name
From Table_Email as E
Left Join Table_People as P
ON E.EmployeeID = P.EmployeeID
Order by CompanyID, Email
-- Loop through the rows with Cursors for CompanyId and Email
OPEN CoCursor
Fetch NEXT FROM CoCursor
INTO @CoId, @Email, @FName, @LName
While @@FETCH_STATUS = 0
BEGIN
-- Check to see if CompanyId has been logged before, if not, proceed
-- Check to see if email matches criteria
IF @Email LIKE @FName + '[_]' + @LName + '@%'
BEGIN
-- If yes, check next email where CompanyIds match
;WITH EmailTable(CompanyID, Email, First_Name, Last_Name) AS (
SELECT E.CompanyID, E.Email, P.First_Name, P.Last_Name
From Table_Emails as E
Left Table_People as P
ON E.EmployeeID = P.EmployeeID
Where E.CompanyID = @CoId
And E.Email LIKE P.First_Name + '[_]' + P.Last_Name + '@%')
Select TOP(2) @condition = 0
FROM EmailTable
Having COUNT(*) > 1
-- If email matches previous email, log Company Id with the email type
IF @condition = 0
PRINT CONVERT(VARCHAR(50), @CoId) + ' has email like firstName_lastName@CompanyAddress.domain'
-- If not, go to next Email check
END
IF @Email LIKE LEFT(@FName,1) + @LName + '@%'
-- If yes, check next email where CompanyIds match
-- If email matches previous email, log Company Id with the email type
-- If it has been logged move onto next record.
Fetch NEXT FROM CoCursor
INTO @CoId, @Email, @FName, @LName
-- Once the result is logged go to next row
END
CLOSE CoCursor
DEALLOCATE CoCursor
我看到的一个解决方案使用临时表来记录以前使用过的 ID,但我的雇主不希望我使用临时表。 How Can I Skip a row(an iteration) in MSSQL Cursor based on some condition?
谢谢!
【问题讨论】:
-
为什么不首先将每家公司的 1 行放入
CURSOR中?虽然我一开始就告诉你CURSOR的原因是我无法理解的。 -
;WITH分号是一个语句终止符,而不是“开始符”。为所有语句使用终止符,您不需要这些杂物。
标签: sql sql-server database-cursor