Удаление начальных нулей из поля в операторе SQL - PullRequest
91 голосов
/ 18 сентября 2008

Я работаю над запросом SQL, который читает из базы данных SQLServer для создания файла извлечения. Одно из требований для удаления начальных нулей из определенного поля, которое является простым VARCHAR(10) полем. Так, например, если поле содержит «00001A», инструкция SELECT должна вернуть данные как «1A».

Есть ли в SQL способ легко удалить ведущие нули таким образом? Я знаю, что есть функция RTRIM, но это, кажется, только для удаления пробелов.

Ответы [ 15 ]

140 голосов
/ 18 сентября 2008
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
23 голосов
/ 16 августа 2012
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
4 голосов
/ 17 августа 2012
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

возвращает N0Z, то есть избавится от ведущих нулей и всего, что предшествует им.

3 голосов
/ 13 ноября 2014

У меня была такая же потребность, и я использовал это:

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end
3 голосов
/ 22 декабря 2010

Если вы хотите, чтобы запрос возвращал 0 вместо строки нулей или любого другого значения по этому вопросу, вы можете превратить это в оператор case, подобный этому:

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END
1 голос
/ 18 апреля 2016

Вы можете использовать это:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
0 голосов
/ 31 января 2019

Вот функция скалярного значения SQL, которая удаляет начальные нули из строки:

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
0 голосов
/ 17 января 2019
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

Это сценарий Sql, имитирующий функциональность команды TRIM в tsql до 2017 года, в основном он такой же, как и другие рекомендации, но другие заменяются одним необычным символом, который все еще может встречаться, '[Rtrim]' или «[Ltrim]» может все еще встречаться в тексте, но замена шляпы уникальным текстом, например, Guid, решит эту проблему.

Я не проверял его на предмет скорости

0 голосов
/ 17 мая 2018

Чтобы удалить ведущий 0, Вы можете умножить числовой столбец на 1 Например: Выбрать (ColumnName * 1)

0 голосов
/ 01 февраля 2018

Вы можете попробовать это - особое внимание уделяется только удалению начальных нулей при необходимости:

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

Или вы можете просто позвонить

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...