截断字符串中的多个值后,选择所有内容

时间:2019-04-19 13:58:35

标签: sql-server tsql

我在表地址中有记录

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

但查询失败

尝试联盟

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 :(得分:0)

如果值真的不大,我会使用cars

apply

答案 1 :(得分:0)

美好的一天

此解决方案基于使用CROSS APPLY的思想,该思想来自Yogesh Sharma提供的解决方案,但是该解决方案涵盖了Yogesh解决方案中丢失的更多情况,例如,如果原始输入中有重复的行,如果我们有多个相同输入中的“停止字符串”,并且不存在“停止点”的情况。

注意! “停止字符串”是指我们搜索的文本,例如“ 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