Заменить первое вхождение пробела на «точку» - PullRequest
0 голосов
/ 27 марта 2020

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

create table cars(make varchar(15), variant varchar(25))
insert into cars values('MARUTI', '1.2 Petrol Vxi')
insert into cars values('MARUTI', '1 2 Petrol Vxi')
insert into cars values('MARUTI', '1.3 Diesel Vdi')
insert into cars values('MARUTI', '1 3 Diesel Zdi')

select * from cars

make    variant
MARUTI  1.2 Petrol Vxi
MARUTI  1 2 Petrol Vxi
MARUTI  1.3 Diesel Vdi
MARUTI  1 3 Diesel Zdi

select variant, REPLACE(variant, '[0-9] [0-9]', '[0-9].[0-9]') as Replaced_val
from cars

variant         Replaced_val
1.2 Petrol Vxi  1.2 Petrol Vxi
1 2 Petrol Vxi  1 2 Petrol Vxi
1.3 Diesel Vdi  1.3 Diesel Vdi
1 3 Diesel Zdi  1 3 Diesel Zdi

Вышеуказанный результат не тот, который я ожидаю

Ожидаемый результат - пространство между двумя цифры должны быть заменены на «.» (точка)

variant         Replaced_val
1.2 Petrol Vxi  1.2 Petrol Vxi
1 2 Petrol Vxi  1.2 Petrol Vxi
1.3 Diesel Vdi  1.3 Diesel Vdi
1 3 Diesel Zdi  1.3 Diesel Zdi

Может кто-нибудь, пожалуйста, дайте мне знать, как go об этом.

Ответы [ 2 ]

4 голосов
/ 27 марта 2020
declare @cars table(make varchar(15), variant varchar(25));
insert into @cars values
('MARUTI', '1.2 Petrol Vxi'),
('MARUTI', '1 2 Petrol Vxi'),
('MARUTI', '1.3 Diesel Vdi'),
('MARUTI', '1 3 Diesel Zdi'),
('MARUTI', 'abc XYZ 1 6 Diesel Zdi');

select *, patindex('%[0-9] [0-9]%', variant) as patind, stuff(variant, patindex('%[0-9] [0-9]%', variant)+1, 1, '.')
from @cars
where patindex('%[0-9] [0-9]%', variant) > 0;
1 голос
/ 27 марта 2020

Если вы хотите SELECT только из таблицы, тогда

SELECT C.Make,
       C.Variant,
       CASE WHEN T.PtIx > 0 
            THEN STUFF(C.Variant, T.PtIx + 1, 1, '.') 
            ELSE C.Variant 
       END Replaced_val
FROM Cars C CROSS APPLY (VALUES(PATINDEX('[0-9] [0-9] %', C.Variant))) T(PtIx);

Если вы собираетесь UPDATE за столом, тогда

UPDATE C
SET C.Variant = STUFF(C.Variant, T.PtIx + 1, 1, '.')
FROM Cars C CROSS APPLY (VALUES(PATINDEX('[0-9] [0-9] %', C.Variant))) T(PtIx)
WHERE T.PtIx > 0;

Вы можете измените '[0-9] [0-9] %' на '%[0-9] [0-9] %'

Посмотрите, как это работает на db <> fiddle

...