有没有办法在 SQL Server 2017 中确定查询的列中是不是存在重复项并更改该输入?

Posted

技术标签:

【中文标题】有没有办法在 SQL Server 2017 中确定查询的列中是不是存在重复项并更改该输入?【英文标题】:Is there a way to determine in SQL Server 2017 if there are duplicates within a column of a query and change that input?有没有办法在 SQL Server 2017 中确定查询的列中是否存在重复项并更改该输入? 【发布时间】:2020-02-06 21:10:55 【问题描述】:

我正在使用 SQL Server 2017 编写一个查询来确定员工的电子邮件,如下所示:

firstname.lastname123@email.com.

这三位数字是其员工 ID 的一部分。 (我没有选择这种方式来确定邮件,无法更改)。

我遇到了一个问题,即恰好有员工同名并且员工 ID 的最后三位数字相同。发生这种情况时,我需要按顺序在电子邮件中添加一个数字以使它们独一无二,即

示例:

姓名:John Doe,员工 ID:00123 john.doe123@email.com

姓名:John Doe,员工 ID:12123 john.doe1231@email.com

姓名:John Doe,员工 ID:98123 john.doe1232@email.com

我不需要假设会有超过 10 个相同的姓名和号码,因此电子邮件中不应出现超过 4 位数字的情况。此外,它确定谁的电子邮件中数字较小的方式是按员工 ID 的顺序。具有较低员工 ID 的人具有上述顺序中较早的电子邮件。

创建他们的电子邮件的查询只是提取他们 ID 的名字、姓氏和最后三位数字,并将它们连接到一个列中。 (first + '.' + last + right(em_id,3) + 'email.com')

如果存在重复项,我应该如何/如何实施以创建上述所需的结果?

【问题讨论】:

您考虑过添加ROW_NUMBER()吗? 【参考方案1】:

您可以使用 row_number()cast 函数将其转换为 varchar,如下所示:

select (name + '.' 
        + surname 
        + right(Employee_ID,3) 
        + cast(row_number() over(partition by name, surname order by Employee_ID) as varchar) 
        + 'email.com') 
from employee

这样你会得到如下结果:

john.doe1231@email.com john.doe1232@email.com john.doe1233@email.com peter.peterson2441@email.com

通过这种修改:

select case when row_number() over(partition by name, surname order by Employee_ID) > 1 
       then (name + '.' 
        + surname 
        + right(Employee_ID,3) 
        + cast(row_number() over(partition by name, surname order by Employee_ID)-1 as varchar) 
        + 'email.com')
       else (name + '.' 
        + surname 
        + right(Employee_ID,3)
        + 'email.com')
       end
from employee    

你会得到你想要的结果。

Here is a DEMO

【讨论】:

【参考方案2】:

聚会迟到了,但您真正需要的是已经存在的“匹配”电子邮件的数量。

DECLARE @emails TABLE (email VARCHAR(100));
INSERT @emails (email)
VALUES ('john.doe123@email.com'),('john.doe1231@email.com'),('john.doe1232@email.com');

DECLARE 
  @newbie VARCHAR(50) = 'john.doe123',
  @addy VARCHAR(50);

SELECT @addy = 
  CONCAT(@newbie,
         CASE WHEN CAST(COUNT(*) AS CHAR(1)) = '0' THEN '' ELSE CAST(COUNT(*) AS CHAR(1)) END)
FROM @emails
WHERE email LIKE CONCAT('%',@newbie,'%')

SELECT @addy;

如果没有匹配项(即CASE 正在工作的表达式),则返回不带后缀的电子邮件地址,如果有匹配项,则添加当前计数。由于系统是基于 0 的,因此不需要对 COUNT 结果进行操作。

【讨论】:

以上是关于有没有办法在 SQL Server 2017 中确定查询的列中是不是存在重复项并更改该输入?的主要内容,如果未能解决你的问题,请参考以下文章

启用 DTC 的 SQL Server 2017 AG 上的 tSQLt

SQL Server插入触发器改进

有没有办法使用普通 ADO 从 SQL Server 检索视图定义?

有没有办法将 SQL Server 2008 mdf 文件转换为 SQL Server Express 版本?

有没有办法在 SQL Server 2000 数据库上列出打开的事务?

有没有办法获取sql server的内置函数列表?