AccountId LoginId
1 Tata-Motors\Harry9
2 Orian-Analytics\Kartik10
3 adventure-works\Rajashree3
Я работаю над Microsoft SQL Server 2022 — 16.0.1115.1
У меня есть образец данных, который я создал для этого эксперимента.
Я хочу динамически удалить название компании спереди и цифры сзади.
Я довольно легко понял, как удалить название компании, но мне сложно динамически удалить номер с конца, чтобы программа работала независимо от длины номера.
Создать заявление:
CREATE TABLE Tester(
[BusinessEntityID] [int] NOT NULL,
[LoginID] [nvarchar](256) NOT NULL
)
Вставьте заявление:
insert into dbo.Tester(BusinessEntityID, LoginId)
values
(1, 'Tata-Motors\Harry9'),
(2, 'Orian-Analytics\Kartik10'),
(3,'adventure-works\Darshana3')
Я попробовал PatIndex, но, похоже, не смог найти точную формулу решения этой проблемы.
select LoginId,
Substring(LoginId,
charindex('\', LoginID)+1, LEN(LoginID)-charindex('\', LoginID)-patindex('%[0-9]%',LoginId)) Name
from dbo.Tester
Это то, что я придумал до сих пор, но выдает ошибку
В функцию LEFT или SUBSTRING передан недопустимый параметр длины.
Ожидаемый результат:
LoginId Name
Tata-Motors\Harry9 Harry
Orian-Analytics\Kartik10 Kartik
adventure-works\Rajashree3 Rajashree
SSMS — это просто приложение IDE, которое используется с несколькими продуктами, такими как (но не ограничиваясь ими) SQL Server, Azure SQL Edge и Azure Synapse. SSMS, вероятно, не имеет отношения к данному вопросу. Какой продукт вы на самом деле используете для своей системы обработки данных? Добавление тега [ssms ] для вашей системы данных аналогично тегированию [ Visual-Studio] для вашего языка программирования; на самом деле это нам ни о чем не говорит.
Останутся цифры, @PowerMouse.
Сообщить нам, что вы используете ssms, — это все равно, что сказать нам, что машина, на которой вы ездите, — Sony, потому что именно эту марку вы видите на радиоприемнике на приборной панели.
Возможно, было бы лучше поместить ошибку в заголовок вопроса, чтобы другим было легче искать в будущем.
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).
Вот какая регулировка длины вам нужна была: patindex('%[^0-9]%', reverse(LoginID)) - 1
Я думаю, ты хотел написать patindex('%[^0-9]%', reverse(LoginID)) + 1
@shawnt00
Что ж, это выражение представляет собой фактическую длину конечной последовательности. Когда вы вычитаете и распределяете знак минус, да, он становится плюсом.
Предполагая, что вы используете SQL Server 2022 (или базу данных SQL Azure), вы можете использовать CHARINDEX
, чтобы найти позицию обратной косой черты (\
), а затем STUFF
, чтобы удалить символы до этой позиции. Затем вы можете использовать RTRIM
, чтобы удалить цифры справа, поскольку теперь он принимает символы для удаления в качестве второго параметра:
SELECT RTRIM(STUFF(V.LoginID,1,CHARINDEX('\',V.LoginID),N''),'0123456789')
FROM (VALUES(1,N'Tata-Motors\Harry9'),
(2,N'Orian-Analytics\Kartik10'),
(3,N'adventure-works\Rajashree3'))V(AccountID,LoginID);
Это недавнее решение для этого:
REPLACE(TRANSLATE(YourField, '1234567890', '##########'),'#','')
нужно удалить название компании
@PowerMouse: нет необходимости удалять это (см. заголовок: «Я хочу динамически удалять числа из конца varchar в SQL»)
Это приведет к удалению любых цифр из середины строки. Хотя не похоже, что у OP есть эта проблема, тем не менее, она не удаляется строго справа, как описана проблема, поэтому на это стоит обратить внимание.
Этот SQL-запрос динамически отсекает ведущее название компании и конечные цифры из поля LoginId
для извлечения имени пользователя.
SELECT
LoginId,
SUBSTRING(
LoginId,
CHARINDEX('\', LoginId) + 1,
LEN(LoginId) - CHARINDEX('\', LoginId) -
(LEN(LoginId) - PATINDEX('%[0-9]%[^0-9]%', REVERSE(LoginId)))
) AS Name
FROM dbo.Tester;
Tata-Motors\Harry9 Harry
Orian-Analytics\Kartik10 Kartik
adventure-works\Rajashree3 Rajashree
Минимальный воспроизводимый пример не приведен.
Я предполагаю, что это SQL Server 2022.
В SQL Server 2022 доступно усовершенствование функции TRIM(). Это усовершенствование позволяет удалить любой конкретный символ(ы) с одной из сторон (слева, справа) или с обеих сторон столбца \ выражения вместе с символом пробела char(32).
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (AccountId INT IDENTITY PRIMARY KEY, LoginId VARCHAR(128));
INSERT @tbl (LoginId) VALUES
('Tata-Motors\Harry9'),
('Orian-Analytics\Kartik10'),
('adventure-works\Rajashree3');
-- DDL and sample data population, end
-- Method #1
SELECT *
, TRIM(TRAILING '1234567890' FROM RIGHT(LoginId, LEN(LoginId) - CHARINDEX('\', LoginId + '\'))) AS [name]
FROM @tbl;
-- Method #2
SELECT *
, TRIM(TRAILING '1234567890' FROM PARSENAME(REPLACE(LoginId,'\','.'), 1)) AS [name]
FROM @tbl;
Выход
WITH
T AS
(SELECT *
FROM (VALUES (1, N'Tata-Motors\Harry9'),
(2, N'Orian-Analytics\Kartik10'),
(3, N'adventure-works\Rajashree3')) AS V (AccountID, LoginID)
)
SELECT TRANSLATE(RIGHT(LoginID, LEN(LoginID) - CHARINDEX('\', LoginID)), '0123456789', ' ')
FROM T
Посмотреть другой пример
select id,LoginId
,substring(part1_2,1,charindex('\',part1_2)-1) part_1
,substring(part1_2,charindex('\',part1_2)+1,100) part_2
,part_3,part1_2
from(
select *
,substring(LoginId,1,len(LoginId)-patindex('%[^0-9]%',reverse(LoginId))+1)part1_2
,right(LoginId,patindex('%[^0-9]%',reverse(LoginId))-1) part_3
from test
)a
Данные испытаний
какую версию SQL-сервера вы используете?