我有一个varchar类型的列,其文本类似于20171126-401-9-4496。字符串有4个部分,每个部分的长度是固定的:
第1-8位
第2-4位数字
第3-2位数字
第4-4位
我想在字符串的第二部分和第三部分填充一个‘0’,这样文本就变成了20171126-0401-09-4496,满足了每个部分的固定长度要求。我尝试了SUBSTRING和CHARINDEX函数,但没有得到想要的结果。这个问题该如何解决?
发布于 2017-11-30 03:12:04
对于PARSENAME黑客来说,这是一个多么完美的时刻!
SELECT PARSENAME(REPLACE(MyColumn,'-','.'),4)+'-'+
RIGHT('0000'+PARSENAME(REPLACE(MyColumn,'-','.'),3),4)+'-'+
RIGHT('00'+PARSENAME(REPLACE(MyColumn,'-','.'),2),2)+'-'+
PARSENAME(REPLACE(MyColumn,'-','.'),1)发布于 2017-11-30 03:17:58
如果你总是想在这些位置上插入一个'0‘,那么它的工作原理是这样的:
select stuff (stuff('20171126-401-9-4496',14,0,0),10,0,'0')

如果我们有可变长度的字段,那么它将像这样工作(第一个字段的例子):
select @str = '20175555-0001-9-46'
select @len = (select charindex('-',substring(@str,10,100)))
select
case
when @len = 2
then stuff(@str,10,0,'000')
when @len = 3
then stuff(@str,10,0,'00')
when @len = 4
then stuff(@str,10,0,'0')
else
@str
end as string发布于 2017-11-30 03:19:41
采用Tab Allemen所做的,您也可以将其应用于第一列和最后一列……
declare @var varchar(18) = '201711-1-9-4496'
SELECT right('00000000' + parsename(replace(@var,'-','.'),4),8) + '-'
+ right('0000' + parsename(replace(@var,'-','.'),3),4) + '-'
+ right('00' + parsename(replace(@var,'-','.'),2),2) + '-'
+ right('0000' + parsename(replace(@var,'-','.'),1),4) https://stackoverflow.com/questions/47559945
复制相似问题