我在表地址中有记录
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
答案 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