在sql中删除任何while循环的列中的前导零

时间:2016-05-19 13:34:46

标签: sql sql-server database

我有一个accountNo列varchar(50)

示例数据

000qw33356
034453534u
a56465470h
00000000a1

我需要输出...

qw33356
34453534u
a56465470h
a1

我有限制,我不能在侧面UDF中使用while循环,因为这会产生性能问题。

5 个答案:

答案 0 :(得分:4)

如果您的数据不包含空格,则可以使用:

select replace(ltrim(replace(data, '0', ' ')),' ', '0')

如果有空格,您可以先将它们替换为其他不存在的空格,然后在最后替换它。

答案 1 :(得分:1)

这是一个有点可爱的变体,不需要替换角色(虽然这是我经常使用的那个):

declare @t table (Val varchar(20))
insert into @t(Val) values
('000qw33356'),
('034453534u'),
('a56465470h'),
('00000000a1')

select SUBSTRING(Val,PATINDEX('%[^0]%',Val),9000)
from @t

结果:

--------------------
qw33356
34453534u
a56465470h
a1

基本上,我们只是将第一个非0字符的子字符串带到结尾(假设9000大于输入字符串长度)

答案 2 :(得分:0)

您可以使用PATINDEX查找拳头非零字符。然后从这一点获得一个SUBSTRING到一个字符串的结尾:

SUBSTRING(accountNo, PATINDEX('%[^0]%',accountNo),1000)

答案 3 :(得分:0)

尝试这样

DECLARE @tbl TABLE(Test VARCHAR(MAX));
INSERT INTO @tbl VALUES
 ('000qw33356')
,('034453534u')
,('a56465470h')
,('00000000a1');

SELECT SUBSTRING(Test,PATINDEX('%[^0]%',Test),1000)
FROM @tbl

答案 4 :(得分:0)

您可以使用 PATINDEX

DECLARE @table TABLE(Data VARCHAR(MAX));
INSERT INTO @table VALUES
('000qw33356'),
('034453534u'),
('a56465470h'),
('00000000a1')

SELECT SUBSTRING(Data,PATINDEX('%[^0]%',Data),8000)
FROM @table