如何从 SQL 中删除前导零
How to remove leading zero(s) from SQL
我想从 SQL table 中删除前导零。我将 3 列作为一列加入。
例子
col1 col2 col3
00000 S Gaskin Road
N Broad Street
00001 John Rolfe Road
我想要的结果是:
1 0 S Gaskin Road or just S Gaskin Road
2 N Broad Street
3 1 John Rolfe Road
这是我加入 3 列的脚本
,COALESCE(CASE WHEN col1 = '' THEN '' ELSE col1 + ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '') as allCol
一种方法使用 patindex()
。我对如何写这篇文章的第一个想法是:
((case when col1 is null or col1 = '' or col1 = '000000' then ''
else substring(col1, patindex('%[^0]%', col1), 6) + ' '
end) +
(case when col2 is null or col2 = '' then ''
else col2 + ' '
end) +
(case when col3 is null or col3 = '' then ''
else col3
end)
) as allcol
如果您已经需要使用 case
,我认为混入 coalesce()
没有任何优势。
cast
col1 到 int
所以前导零被删除并且 cast
int
到 varchar
用于连接。
COALESCE(CASE WHEN col1 = '' THEN '' ELSE cast(cast(col1 as int) as varchar(255))+ ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '')
您可以定义自己的函数来删除所有前导零:
CREATE FUNCTION RemoveLeadingZeros(@value varchar(255)) RETURNS varchar(255)
AS
BEGIN
while substring(@value, 1, 1) = '0' and datalength(@value) > 1
begin
set @value = substring(@value, 2, 255)
end
return @value;
END
GO
所以现在您的 3 个字段的串联将是:
,COALESCE(CASE WHEN col1 = '' THEN '' ELSE dbo.RemoveLeadingZeros(col1) + ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '') as allCol
COALESCE(CASE WHEN col1 = '' THEN '' ELSE SUBSTRING(col1, PATINDEX('%[^0]%', col1+'.'), LEN(col1))+ ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '')
对于 Amazon Redshift:
TRIM(LEADING '0' FROM colname)
我想从 SQL table 中删除前导零。我将 3 列作为一列加入。 例子
col1 col2 col3
00000 S Gaskin Road
N Broad Street
00001 John Rolfe Road
我想要的结果是:
1 0 S Gaskin Road or just S Gaskin Road
2 N Broad Street
3 1 John Rolfe Road
这是我加入 3 列的脚本
,COALESCE(CASE WHEN col1 = '' THEN '' ELSE col1 + ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '') as allCol
一种方法使用 patindex()
。我对如何写这篇文章的第一个想法是:
((case when col1 is null or col1 = '' or col1 = '000000' then ''
else substring(col1, patindex('%[^0]%', col1), 6) + ' '
end) +
(case when col2 is null or col2 = '' then ''
else col2 + ' '
end) +
(case when col3 is null or col3 = '' then ''
else col3
end)
) as allcol
如果您已经需要使用 case
,我认为混入 coalesce()
没有任何优势。
cast
col1 到 int
所以前导零被删除并且 cast
int
到 varchar
用于连接。
COALESCE(CASE WHEN col1 = '' THEN '' ELSE cast(cast(col1 as int) as varchar(255))+ ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '')
您可以定义自己的函数来删除所有前导零:
CREATE FUNCTION RemoveLeadingZeros(@value varchar(255)) RETURNS varchar(255)
AS
BEGIN
while substring(@value, 1, 1) = '0' and datalength(@value) > 1
begin
set @value = substring(@value, 2, 255)
end
return @value;
END
GO
所以现在您的 3 个字段的串联将是:
,COALESCE(CASE WHEN col1 = '' THEN '' ELSE dbo.RemoveLeadingZeros(col1) + ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '') as allCol
COALESCE(CASE WHEN col1 = '' THEN '' ELSE SUBSTRING(col1, PATINDEX('%[^0]%', col1+'.'), LEN(col1))+ ' ' END, '') +
COALESCE(CASE WHEN col2 = '' THEN '' ELSE col2 + ' ' END, '') +
COALESCE(CASE WHEN col3 = '' THEN '' ELSE col3 + ' ' END, '')
对于 Amazon Redshift:
TRIM(LEADING '0' FROM colname)