我在表中有一个名为Address的列。 我有像
这样的价值观12-15 Hardley Street
2A-C Hardley Street
A-2c Hardley Street
A-B Hardley Street
我需要在前三行保持连字符( - )不变。
即。如果单词中有一个包含连字符( - )的数字,我应该保留它,否则我应该用空格替换。
因此,列应替换为
12-15 Hardley Street
2A-C Hardley Street
A-2c Hardley Street
A B Hardley Street
我的小脑子无法理解这一点。 任何帮助请。
p.s:我还想补充一点,第一个单词不一定包含连字符。
数据可以是
Hardley Street 2A-C
或
2A-C
感谢您的回复和评论。
还有一个先决条件,我应该在更新查询中做。
declare @data nvarchar(200)
set @data='12-12 ORANGE-RED'
select @data=
case left(@data,charindex(' ',@data))
when '' then
CASE PATINDEX ('%[0-9]%',@data)
when 0 then replace(@data,'-',' ')
else @data
END
else
CASE PATINDEX ('%[0-9]%',left(@data,charindex(' ',@data)))
when 0 then replace(left(@data,charindex(' ',@data)),'-',' ')+'-- LEFT MOST WORD REPLACE'
else
CASE charindex (' ',substring(@data,charindex(' ',@data)+1,len(@data)))
WHEN 0 THEN
CASE PATINDEX ('%[0-9]%',substring(@data,charindex(' ',@data)+1,len(@data)))
when 0 then left(@data,charindex(' ',@data))+ replace(substring(@data,charindex(' ',@data)+1,len(@data)),'-',' ') +'--RIGHT MOST REPLACE'
else @data + '--struggling here'
END
END
END
end
where @data like '%-%'
select @data
我已经尝试了以上内容 我将更新表格
update tblname set @columnName=
--lines of coding
where @columnName like '%-%'
我无法解决这个问题,加上我的困境,数据会不一致。
我假设数据有两个单词,例如
2A-C Hardley Street
A-2c Hardley Street
A B Hardley Street
但是客户表示他将拥有数据
Hardley Street 22-23 BO'NESS
A-2c Hardley Street
Hardley Street 12B Stratford-upon-avon
我无法创建函数,原因是我们要更新表格并对其进行格式化。 如果我创建一个函数,我应该为每一行调用它,这很费时。
请不要建议SSIS,因为已经排除了。
任何想法都会非常有用。
答案 0 :(得分:2)
答案 1 :(得分:1)
这不是SQL构建的事情。如果可能的话,像这样的逻辑在应用层中更好地服务(并且更容易完成)。
答案 2 :(得分:0)
如果您使用空格分隔数据,并且您的第一列没有空格,您可以尝试按照
select
LEFT(a,charindex(' ',a)-1) as leftSide
,SUBSTRING(a,charindex(' ',a)+1,LEN(a)) as rightSide
from
(
select '12-15 Hardley Street ' as a
union all
select '2A-C Hardley Street '
union all
select 'A-2c Hardley Street '
union all
select 'A-B Hardley Street'
) as a
如果左侧有空格,那么您应该更详细地描述添加数据的规则,并且可能尝试使用正如提到的Regex
答案 3 :(得分:0)
create function ParseAddress(@Address varchar(255))
returns varchar(255)
as
BEGIN
declare @result varchar(255)
declare @str varchar(255)
declare @i smallint
declare @j smallint
declare @Separator char(1)
set @Separator = ' '
set @str = @Address
set @str = REVERSE(@str)
set @j = PATINDEX ('%[0-9]%',LEFT(@str,CHARINDEX(char(10),@str)))
if @j > 0 set @Separator = '-'
set @i = PATINDEX ('%-%',@str)
set @result = REVERSE( LEFT(@str,@i-1) + @Separator + RIGHT(@str,LEN(@str) - @i))
RETURN @result
end