Выберите все после усечения нескольких значений из строки - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть записи в таблице с адресом

6321  24TH AVE APT2 
2232 S ALLIS ST LOT 4
824 JENIFER ST Unit 2 

Я хочу обрезать и выделить все до 'APT', 'LOT', 'UNIT' в одном запросе подстроки

У меня естьпробовал

select SUBSTRING([ADDR1],0,CHARINDEX(' APT',[ADDR1]))
from Address 

, который только выбирает все до APT, но не 'LOT', 'UNIT'

select SUBSTRING([ADDR1],0,CHARINDEX(' APT',[ADDR1]), CHARINDEX( 'LOT',[Addr1]),CHARINDEX( 'Unit',[Addr1]))
from Address

, но запрос не выполнен

Tried Union

select SUBSTRING([ADDR1],0,CHARINDEX(' APT',[ADDR1])) from Address
Union
select SUBSTRING([ADDR1],0,CHARINDEX(' LOT',[ADDR1])) from Address

, но есть другие наборы значений, трейлер, trlr, аналогичный тому, который добавляется с объемом данных. Я не рассматриваю несколько UNIONS

Желаемый результат

6321 24TH AVE
2232 S ALLIS ST
824 JENIFER ST

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Добрый день,

Это решение основано на идее использования 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
0 голосов
/ 19 апреля 2019

Я бы использовал apply, если значения действительно не велики:

select distinct a.[ADDR1], substring(a.[ADDR1], 0, aa.lens)
from address a cross apply
     ( values ( (CHARINDEX('APT', [ADDR1])), 
                (CHARINDEX('LOT', [ADDR1])),
                (CHARINDEX('Unit', [ADDR1]),
                 . . . . . . . . . . . . . -- more filter as you want
              )
     ) aa(lens)
where aa.lens > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...