有没有办法在 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 编写一个查询来确定员工的电子邮件,如下所示:
名字.姓氏123@email.com.
这三位数字是其员工 ID 的一部分。 (我没有选择这种方式来确定电子邮件,无法更改)。
我 运行 遇到这样一个问题,即恰好有员工具有相同的姓名并且其员工 ID 的最后三位数字相同。发生这种情况时,我需要按顺序在电子邮件中添加一个数字以使其唯一,即
示例:
姓名:John Doe,员工编号: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')
How/What 如果存在重复项,我能否实施以创建上述所需结果?
您可以使用 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
你会得到你想要的结果。
晚会迟到了,但您真正需要的是计算 "matching" 封已存在的电子邮件。
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;
Returns 如果没有匹配项,则不带后缀的电子邮件地址(这是工作中的 CASE
表达式),如果有匹配项,则添加当前计数。由于系统是基于 0 的,因此不需要对 COUNT
结果进行操作。
我正在 SQL Server 2017 编写一个查询来确定员工的电子邮件,如下所示:
名字.姓氏123@email.com.
这三位数字是其员工 ID 的一部分。 (我没有选择这种方式来确定电子邮件,无法更改)。
我 运行 遇到这样一个问题,即恰好有员工具有相同的姓名并且其员工 ID 的最后三位数字相同。发生这种情况时,我需要按顺序在电子邮件中添加一个数字以使其唯一,即
示例:
姓名:John Doe,员工编号: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')
How/What 如果存在重复项,我能否实施以创建上述所需结果?
您可以使用 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
你会得到你想要的结果。
晚会迟到了,但您真正需要的是计算 "matching" 封已存在的电子邮件。
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;
Returns 如果没有匹配项,则不带后缀的电子邮件地址(这是工作中的 CASE
表达式),如果有匹配项,则添加当前计数。由于系统是基于 0 的,因此不需要对 COUNT
结果进行操作。