SQL Server удаляет часть строки между символами
У меня есть письма, которые выглядят так:
john.doe.946a9979-2951-4852-9e79-ad03eb0c1e5d@gmail.com
Я пытаюсь получить этот вывод:
john.doe@gmail.com
У меня есть это до сих пор.... это близко.
SELECT
Caller = REPLACE(Caller,
SUBSTRING(Caller,
CHARINDEX('.', Caller),
CASE WHEN CHARINDEX('@', Caller, CHARINDEX('.', Caller)) > 1 THEN
CHARINDEX('@', Caller, CHARINDEX('.', Caller)) - CHARINDEX('.', Caller)
ELSE
LEN(Caller)
END ) , '')
FROM
some.table
4 ответа
Вот более простой метод с использованием LEFT()
, RIGHT()
, а также CHARINDEX()
функции
DECLARE @Caller VARCHAR(MAX) = 'john.doe.946a9979-2951-4852-9e79-ad03eb0c1e5d@gmail.com'
SELECT
LEFT(@Caller, CHARINDEX('.', @Caller, CHARINDEX('.', @Caller) + 1) - 1) + RIGHT(@Caller, LEN(@Caller) - CHARINDEX('@', @Caller) + 1) Email
Левая сторона получит все символы до второй точки, а правая сторона получит символы от знака @ до конца символов.
Хммм. Я подозреваю, что строка, которую вы хотите удалить, имеет фиксированную длину. Так как насчет:
select stuff(caller, charindex('@',caller ) - 37, 37, '')
Если у вас SS 2016 или новее, вы можете использовать код R для этого - при условии, что я не знаю о скорости на больших данных, поэтому будьте осторожны, если это производственная среда. Также имейте в виду, что регулярные выражения не моя самая сильная область, поэтому вы можете проверить эту часть.
DECLARE @dummyScript NVARCHAR(1000) = '
SELECT * FROM
(VALUES (''john.doe.946a9979-2951-4852-9e79-ad03eb0c1e5d@gmail.com''),
(''jane whoever 1234453-534343@yahoo.com'') ) t (Email)
'
DECLARE @myRcode NVARCHAR(600)
SET @myRcode = 'OutputDataset <- data.frame(Email_Cleaned = gsub("[0-9]+.+@", "@", InputDataSet$Email)) '
DECLARE @CleanedTable TABLE (Email_Cleaned VARCHAR(500))
INSERT INTO @CleanedTable
EXEC sp_execute_external_script
@language = N'R'
,@script = @myRcode
,@input_data_1 = @dummyScript
,@input_data_1_name = N'InputDataSet'
,@output_data_1_name = N'OutputDataset'
SELECT * FROM @CleanedTable
Попробуйте как ниже
SELECT
REPLACE(CALLER,
Substring(CALLER,
PATINDEX('.[0-9]%@', CALLER),
PATINDEX('@', CALLER ) )
,'@')
From Table