Есть ли способ определить в SQL Server 2017, есть ли дубликаты в столбце запроса, и изменить этот ввод? - PullRequest
1 голос
/ 07 февраля 2020

Я работаю над SQL Server 2017, пишу запрос, который определяет электронные письма сотрудников, которые выглядят так:

имя. lastname123@email.com.

Три цифры являются частью их сотрудника идентификаторы. (Я не выбрал этот способ для определения адресов электронной почты и не могу его изменить).

Я столкнулся с проблемой, когда просто бывают сотрудники с одинаковыми именами и с теми же тремя последними цифрами идентификатора сотрудника. , Когда это происходит, мне нужно добавить номер в порядке последовательности к электронному письму, чтобы сделать их уникальными, например:

Примеры:

Имя: Джон Доу, Код сотрудника: 00123 Джон. doe123@email.com

Имя: Джон Доу, ID сотрудника: 12123 Джон. doe1231@email.com

Имя: Джон Доу, ID сотрудника: 98123 Джон. doe1232@email.com

Мне не нужно предполагать, что будет более 10 с одинаковыми именем и номером, поэтому не должно быть никаких случаев, кроме четырех цифр в электронном письме. Кроме того, способ определения младших цифр в их электронных письмах определяется порядком идентификатора сотрудника. Кто имеет более низкий идентификатор сотрудника, имеет более раннее электронное письмо в последовательности, описанной выше.

Запрос, который создает их электронную почту, просто извлекает имя, фамилию и последние три цифры своего идентификатора и объединяет их в один столбец. (first + '.' + last + right (em_id, 3) + 'email.com')

Как / Что я могу реализовать, чтобы создать желаемый результат, описанный выше, если дубликаты существуют?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Вы можете использовать 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
  • Джон. doe1232@email.com
  • Джон. doe1233@email.com
  • Питер. 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    

Вы получите запрошенные результаты.

Вот ДЕМО

0 голосов
/ 07 февраля 2020

Опоздал на вечеринку, но все, что вам действительно нужно, это количество "совпадающих" электронных писем, которые уже существуют.

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 не требуется.

...