Разделить электронное письмо в запросе

У меня есть таблица под названием user, которая содержит имя поля и адрес электронной почты.

Отправьте электронное письмо всем, следуя этому синтаксису

[email protected]

И я хочу иметь запрос, который обновляет мою таблицу имен, чтобы она выглядела так

name forname

Я уже пробовал использовать string_split.

Как разделить адрес электронной почты на части

Я использовал эту ссылку, чтобы понять, но SELECT выдает мне ошибку.

Дело в том, что я не понимаю, как этим пользоваться.

Если бы кто-нибудь мог просто объяснить, как это работает, было бы здорово.

Не используйте string_split. Вместо этого используйте SUBSTRING и CHARINDEX. Какую ошибку вы получили, когда попытались использовать примеры по ссылке?

Bart McEndree 10.07.2024 15:57

String_Split разбивает столбец на строки. Вы можете попробовать substring/charindex или, возможно, parsename.

Andrew 10.07.2024 15:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если я правильно понял ваш вопрос, то есть обновить столбец name именами, включенными в столбец Email, вы можете попробовать этот запрос:

UPDATE [user]
SET name = SUBSTRING(email, 1, CHARINDEX('.', email) - 1) + ' ' + SUBSTRING(email, CHARINDEX('.', email) + 2, CHARINDEX('@', email) - CHARINDEX('.', email) - 2)
WHERE CHARINDEX('.', email) > 0;

по сути, это объединяет две подстроки (с пробелом между ними) и воздействует на них на атрибут name для каждой строки в вашей таблице User, используя заранее известные разделители ('.' и .'@').

предложение WHERE здесь предназначено только для того, чтобы гарантировать, что запрос подействует только на те строки, значения электронной почты которых содержат символ «.». чар.

Спасибо за информацию, я попробовал и получил эту ошибку. Сообщение 537, уровень 16, состояние 3, строка 1. Неверный параметр длины, переданный в функцию LEFT или SUBSTRING.

Kaiwinta 10.07.2024 16:08

Как применить ваш пример к этой ссылке Как разделить адрес электронной почты на части Ваша ошибка может быть связана с использованием пользователя в качестве имени таблицы. ПОЛЬЗОВАТЕЛЬ — зарезервированное слово, поэтому с ним необходимо использовать скобки.

SELECT 
LEFT(email, CHARINDEX('@', email) - 1) AS accountName  
,LEFT(LEFT(email, CHARINDEX('@', email) - 1) , CHARINDEX('.', email) - 1)  As [Name before period]   
,RIGHT(LEFT(email, CHARINDEX('@', email) - 1) , LEN(LEFT(email, CHARINDEX('@', email) - 1)) - CHARINDEX('.', LEFT(email, CHARINDEX('@', email) - 1)))    As [Name after period] 
,RIGHT(email, LEN(email) - CHARINDEX('@', email)) AS domainWithExtension
,LEFT(RIGHT(email, LEN(email) - CHARINDEX('@', email)), CHARINDEX('.', RIGHT(email, LEN(email) - CHARINDEX('@', email))) - 1) AS domain
,RIGHT(RIGHT(email, LEN(email) - CHARINDEX('@', email)), LEN(RIGHT(email, LEN(email) - CHARINDEX('@', email))) - CHARINDEX('.', RIGHT(email, LEN(email) - CHARINDEX('@', email)))) AS extension
FROM [user]

поэтому из этого мы можем построить обновление:

UPDATE [user] 
SET name=
LEFT(LEFT(email, CHARINDEX('@', email) - 1) , CHARINDEX('.', email) - 1)  
+ ' ' + 
RIGHT(LEFT(email, CHARINDEX('@', email) - 1) , LEN(LEFT(email, CHARINDEX('@', email) - 1)) - CHARINDEX('.', LEFT(email, CHARINDEX('@', email) - 1))) 

рабочий пример

Имя учетной записи Имя до точки Имя после точки доменсрасширение домен расширение имя.дляимя имя имя домен.com домен ком имя1.дляимя1 имя1 имя1 домен1.com домен1 ком имя2.дляимя2 имя2 имя2 домен1.com домен1 ком имя3.дляимя3 имя3 имя3 домен1.com домен1 ком имя4.дляимя4 имя4 имя4 домен1.com домен1 ком
Ответ принят как подходящий

Пожалуйста, попробуйте следующее решение, основанное на функции PARSENAME().

Итак, мы будем использовать метод токенизации вместо анализа строк.

Предполагается, что все электронные письма строго соответствуют формату из четырех частей, что и [email protected].

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, name VARCHAR(50), email VARCHAR(128));
INSERT @tbl (name, email) VALUES
('name1', '[email protected]'),
('name2', '[email protected]');
-- DDL and sample data population, end

-- before
SELECT * FROM @tbl;

UPDATE t1
SET name = PARSENAME(tokens, 4) + SPACE(1) + PARSENAME(tokens, 3)
FROM @tbl AS t1
CROSS APPLY (SELECT REPLACE(email,'@', '.')) AS t2(tokens);

-- after
SELECT * FROM @tbl;

Выход

идентификатор имя электронная почта 1 имя для имени имя.дляимя@домен.com 2 Джон Доу [email protected]

Другие вопросы по теме