Динамически удалять числа из конца varchar в SQL

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

какую версию SQL-сервера вы используете?

Power Mouse 06.06.2024 14:49

SSMS — это просто приложение IDE, которое используется с несколькими продуктами, такими как (но не ограничиваясь ими) SQL Server, Azure SQL Edge и Azure Synapse. SSMS, вероятно, не имеет отношения к данному вопросу. Какой продукт вы на самом деле используете для своей системы обработки данных? Добавление тега [ssms ] для вашей системы данных аналогично тегированию [ Visual-Studio] для вашего языка программирования; на самом деле это нам ни о чем не говорит.

Thom A 06.06.2024 15:01

Останутся цифры, @PowerMouse.

Thom A 06.06.2024 15:11

Сообщить нам, что вы используете ssms, — это все равно, что сказать нам, что машина, на которой вы ездите, — Sony, потому что именно эту марку вы видите на радиоприемнике на приборной панели.

Joel Coehoorn 06.06.2024 15:26

Возможно, было бы лучше поместить ошибку в заголовок вопроса, чтобы другим было легче искать в будущем.

Anshuman Kumar 06.06.2024 15:56

Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и образец набора данных, т. е. таблицы CREATE плюс инструкции INSERT T-SQL. (2) Что вам нужно сделать, то есть логику и попытку реализации вашего кода в T-SQL. (3) Желаемый результат, основанный на примере данных в пункте 1 выше. (4) Версия вашего SQL-сервера (ВЫБЕРИТЕ @@version;).

Yitzhak Khabinsky 06.06.2024 16:50

Вот какая регулировка длины вам нужна была: patindex('%[^0-9]%', reverse(LoginID)) - 1

shawnt00 06.06.2024 19:57

Я думаю, ты хотел написать patindex('%[^0-9]%', reverse(LoginID)) + 1 @shawnt00

Kartik Iyer 07.06.2024 15:19

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

shawnt00 07.06.2024 16:33
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
9
129
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Предполагая, что вы используете 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', '##########'),'#','')

нужно удалить название компании

Power Mouse 06.06.2024 16:19

@PowerMouse: нет необходимости удалять это (см. заголовок: «Я хочу динамически удалять числа из конца varchar в SQL»)

Luuk 06.06.2024 17:44

Это приведет к удалению любых цифр из середины строки. Хотя не похоже, что у OP есть эта проблема, тем не менее, она не удаляется строго справа, как описана проблема, поэтому на это стоит обратить внимание.

shawnt00 06.06.2024 19:26

Этот 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;

Выход

идентификатор аккаунта Логин ID имя 1 Тата-Моторс\Гарри9 Гарри 2 Ориан-Аналитика\Картик10 Картик 3 приключения-работы\Rajashree3 Раджашри
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

Данные испытаний

идентификатор Логин ID часть_1 часть 2 часть_3 часть1_2 1 Тата-Моторс\Гарри9 Тата-Моторс Гарри 9 Тата-Моторс\Гарри 2 Ориан-Аналитика\Картик10 Ориан-Аналитика Картик 10 Ориан-Аналитика\Картик 3 приключения-работы\Rajashree3 приключенческие произведения Раджашри 3 приключенческие работы\Раджашри 4 Команда24\include324 Команда24 включать 324 Team24\include 5 Team24\нонум Команда24 нонум Team24\нонум 6 Альфа\нонум Альфа нонум Альфа\нонум

Скрипка

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