截断sql server中的前导零
我需要代表以下记录截断sql server中的前导零,sql,sql-server,Sql,Sql Server,我需要代表以下记录 DATA 000200AA 00000200AA 000020BCD 00000020BCD 000020ABC 作为 有什么想法吗 一个好的递归用户定义函数怎么样 CREATE FUNCTION dbo.StripLeadingZeros ( @input varchar(MAX) ) RETURNS varchar(MAX) BEGIN IF LEN(@input) = 0 RETURN @input IF SUBST
DATA
000200AA
00000200AA
000020BCD
00000020BCD
000020ABC
作为
有什么想法吗 一个好的递归用户定义函数怎么样
CREATE FUNCTION dbo.StripLeadingZeros (
@input varchar(MAX)
) RETURNS varchar(MAX)
BEGIN
IF LEN(@input) = 0
RETURN @input
IF SUBSTRING(@input, 1, 1) = '0'
RETURN dbo.StripLeadingZeros(SUBSTRING(@input, 2, LEN(@input) - 1))
RETURN @input
END
GO
然后:
使用patindex
select count(test) as cnt,
substring(test, patindex('%[^0]%',test),len(test)) from (
select ('000200AA') as test
union
select '00000200AA' as test
union
select ('000020BCD') as test
union
select ('00000020BCD') as test
union
select ('000020ABC') as test
)ty
group by substring(test, patindex('%[^0]%',test),len(test))
根据需要获取的值,此代码可能会有所不同: 假设一个简单的右图是Barry建议的5个字符,您可以使用右图(数据,5)和GROUP BY and COUNT来获得结果 看看这个函数 它将数据插入范围的字符串中您可以执行以下查询:
SELECT RIGHT([DATA],LEN[DATA])-PATINDEX('%[1-9]%',[DATA])+1) [DATA], COUNT(*) CNT
FROM YourTable
GROUP BY RIGHT([DATA],LEN[DATA])-PATINDEX('%[1-9]%',[DATA])+1)
前导零是否总是跟在一个
2
后面,或者您总是只对正确的5个字符感兴趣?它们也可以超过5个(尽管如此,timus的解决方案更好。)由于字符串应以0
开头,我们是否仍然需要前导的%
(我不习惯SQL Server,但文档似乎暗示此处不需要它…)?这仅在第一个字符始终为2
时才有效,看你的例子,我认为第一个字符永远是2。
select count(test) as cnt,
substring(test, patindex('%[^0]%',test),len(test)) from (
select ('000200AA') as test
union
select '00000200AA' as test
union
select ('000020BCD') as test
union
select ('00000020BCD') as test
union
select ('000020ABC') as test
)ty
group by substring(test, patindex('%[^0]%',test),len(test))
DECLARE @String VARCHAR(32) = N'000200AA'
SELECT SUBSTRING ( @String ,CHARINDEX(N'2', @String),LEN(@String))
SELECT RIGHT([DATA],LEN[DATA])-PATINDEX('%[1-9]%',[DATA])+1) [DATA], COUNT(*) CNT
FROM YourTable
GROUP BY RIGHT([DATA],LEN[DATA])-PATINDEX('%[1-9]%',[DATA])+1)