Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
截断sql server中的前导零_Sql_Sql Server - Fatal编程技术网

截断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)