Removing leading zeroes from a field in a SQL statement
我正在处理从SQLServer数据库读取以生成提取文件的SQL查询。 从特定字段中删除前导零的要求之一是一个简单的VARCHAR(10)字段。 因此,例如,如果该字段包含" 00001A",则SELECT语句需要将数据返回为" 1A"。
SQL中是否可以通过这种方式轻松删除前导零? 我知道有一个RTRIM函数,但这似乎只能删除空格。
1
| SELECT SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10) |
1
| SELECT REPLACE(ltrim(REPLACE(ColumnName,'0',' ')),' ','0') |
我有同样的需求,并使用了这个:
1 2 3 4 5 6
| SELECT
CASE
WHEN LEFT(COLUMN,1) = '0'
THEN RIGHT(COLUMN, (len(COLUMN)-1))
ELSE COLUMN
END |
1 2 3
| SELECT SUBSTRING(SUBSTRING('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20),
patindex('%[^0]%',SUBSTRING('B10000N0Z', patindex('%[0]%','B10000N0Z'),
20)), 20) |
返回N0Z,也就是说,将除去前导零和之前的零。
如果您希望查询返回0而不是零或任何其他值,则可以将其转换为case语句,如下所示:
1 2 3 4 5
| SELECT CASE
WHEN ColumnName = SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10)
THEN '0'
ELSE SUBSTRING(ColumnName, patindex('%[^0]%',ColumnName), 10)
END |
您可以使用此:
1
| SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0') |
这是从字符串中删除前导零的SQL标量值函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Vikas Patel
-- Create date: 01/31/2019
-- Description: Remove leading zeros from string
-- =============================================
CREATE FUNCTION dbo.funRemoveLeadingZeros
(
-- Add the parameters for the function here
@INPUT VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
-- Declare the return variable here
DECLARE @RESULT VARCHAR(MAX)
-- Add the T-SQL statements to compute the return value here
SET @RESULT = @INPUT
WHILE LEFT(@RESULT, 1) = '0'
BEGIN
SET @RESULT = SUBSTRING(@RESULT, 2, LEN(@RESULT) - 1)
END
-- Return the result of the function
RETURN @RESULT
END
GO |
您可以尝试一下-需要特别注意的是仅删除前导零:
1 2 3 4 5 6 7 8 9 10
| DECLARE @LeadingZeros VARCHAR(10) ='-000987000'
SET @LeadingZeros =
CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1 THEN
@LeadingZeros
ELSE
CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10))
END
SELECT @LeadingZeros |
或者您可以简单地致电
1
| CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) |
要删除前导0,您可以将数字列乘以1
例如:选择(ColumnName * 1)
你可以试试这个
SELECT REPLACE(columnname,'0','') FROM table
从下个月的声明中删除前导0肯定是可行的。
1
| SELECT REPLACE(LEFT(CONVERT(nvarchar,GETDATE(),101),2),'0','')+RIGHT(CONVERT(nvarchar,GETDATE(),101),8) |
只需将GETDATE()替换为表格的日期字段即可。
1
| SELECT REPLACE(REPLACE(rtrim(REPLACE(REPLACE(REPLACE(REPLACE(ltrim(REPLACE(REPLACE([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') AS RESULT |
这是一个Sql脚本,用于模拟2017年之前的tsql中TRIM命令的功能,它与其他建议基本相同,但其他替换为单个仍不常见的字符,[Rtrim]'或'[ Ltrim]'仍可能出现在文本中,但是用唯一的文本替换hat,例如Guid可以解决该问题。
我还没有测试速度
1 2 3 4 5
| SELECT CASE
WHEN TRY_CONVERT(BIGINT,Mtrl_Nbr) = 0
THEN ''
ELSE SUBSTRING(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
END |
我从上面的想法中借鉴了。这既不快也不优雅。但这是准确的。
案件
1 2 3 4 5 6 7
| WHEN LEFT(COLUMN, 3) = '000' THEN RIGHT(COLUMN, (len(COLUMN)-3))
WHEN LEFT(COLUMN, 2) = '00' THEN RIGHT(a.column, (len(COLUMN)-2))
WHEN LEFT(COLUMN, 1) = '0' THEN RIGHT(a.column, (len(COLUMN)-1))
ELSE |
结束
1 2 3 4 5
| SELECT ltrim('000045', '0') FROM dual;
LTRIM
-----
45 |
这应该做。
|