Добрый день,
Это решение основано на идее использования CROSS APPLY, которое пришло из решения, предоставленного Йогешем Шармой, но в данном случае рассматриваются другие случаи, которые теряются в решении Йогеша, например, если у нас есть дублирующиеся строки в исходном вводе, если у нас есть несколько «стоп-строки» в том же входе и случай, когда «стоп-точки» не существует.
Внимание! под «Стоп-строкой» я подразумеваю текст, который мы ищем, например «APT» или «LOT».
Чтобы рассмотреть случаи, не охваченные другим решением, я добавлю несколько строк, которые представляют эти случаи
drop table if exists T
GO
create table T(txt nvarchar(MAX))
GO
insert T(txt) values
('1111 24TH AVE APT2' ),
('1111 24TH AVE APT2' ),--duplicate
('2222 S ALLIS ST LOT 4'),
('333 JENIFER ST Unit 2' ),
('44444 JENIFER LOTST Unit 2' ),-- notice that we have both " LOT" and " Unit" in the string
('55555 JENIFERLOT LOTST s' ),
('6666 JENIFE s' ),--no "stop point"
('6666 JENIFE s' )--duplicate + no "stop point"
GO
select * from T
GO
Обратите внимание, что у нас есть дубликаты строк, которые мы не хотим терять. У нас есть 8 строк в источнике, и мы ожидаем получить 8 строк в наборе результатов
select
-- you can un-mark the next line as comment - this is only for the understganding of the solution
-- a.[txt], aa.lens, aa.RN,
CASE
WHEN aa.lens>0 then substring(a.[txt], 0, aa.lens)
ELSE a.[txt]
END
from T a
cross apply(
-- This will fix case that we have several "stop values" in the same string
SELECT RN=ROW_NUMBER() OVER (partition by v order by lens desc), lens
FROM (
values
(CHARINDEX(' APT' , [txt]),[txt]),
(CHARINDEX(' LOT' , [txt]),[txt]),
(CHARINDEX(' Unit', [txt]),[txt])
) aa(lens, v)
) aa
where RN = 1