Удаление начальных нулей из поля в операторе SQL


99

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

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


3
В качестве голоса за ответ Дэвида Уокера stackoverflow.com/a/11129399/1635441 , пожалуйста, обратитесь к опубликованному ответу Арво: stackoverflow.com/a/662437/1635441
ramizmoh

Ответы:


152
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

8
Это будет иметь проблемы, если строка полностью состоит из «0», поскольку она никогда не будет соответствовать символу, отличному от «0».
Cade Roux,

Правда. В этом случае он вернет всю неизмененную строку нулей. Если это проблема, то возвращаемое значение patindex должно быть проверено на ноль.
Ян Хорвилл,

@Zapnologica: Нет. Вам нужно будет поместить это в оператор «обновить TableName, установить ColumnName = ...».
Ян Хорвилл

Конечно, если вы используете операторы обновления.
Srivastav

1
Перед использованием этого решения, пожалуйста, попробуйте изучить ответ Арво, размещенный здесь
OscarSosa

27
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

Я получил «Функция замены требует 3 аргумента». Я считаю, что он должен читать select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
brentlightsey

5
Это не удастся, если в значении есть пробел. Пример: «0001 B» должно стать «1 B», но вместо этого станет «10B».
Омаер

1
Как упоминалось в @Omaer, это небезопасно, если в строке есть пробелы. Улучшенное решение - сначала замените пробелы на char, который вряд ли попадет на ввод, а после 0-ltrim восстановите эти символы до пробелов после. В итоге выглядит довольно сложно :( Пример: выберите replace (replace (ltrim (replace (replace ('000309933200,00 USD', '', '|'), '0', '')), '', '0 '),' | ',' ') -> 309933200,00 USD
Роберт Луджо

5
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

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


5
Как это ведущий 0, если что-то идет перед ним?
xxbbcc

4

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

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end

3

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

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END


0

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

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

0

Вот функция скалярного значения 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

Если вы хотите удалить ведущие нули из строки неизвестного размера.

Вы можете рассмотреть возможность использования команды STUFF.

Вот пример того, как это будет работать.

SELECT ISNULL(STUFF(ColumnName
                   ,1
                   ,patindex('%[^0]%',ColumnName)-1
                   ,'')
             ,REPLACE(ColumnName,'0','')
             )

Посмотрите в скрипачке различные сценарии, которые он охватит

https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=14c2dca84aa28f2a7a1fac59c9412d48


-1

Чтобы удалить начальный 0 из месяца, следующий оператор определенно сработает.

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

Просто замените GETDATE()поле даты в таблице.


3
Как именно это отвечает на вопрос?
deutschZuid

-2

ты можешь попробовать это SELECT REPLACE(columnname,'0','') FROM table


3
Это приведет к удалению 0 независимо от его положения. Вопрос касается только ведущих.
Sunil

-2

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


3
Чему равно "1A" * 1?
Джонатан Рис

что значит 10 * 1 будет?
РАТАН КУМАР

В вопросе было указано, что тип столбца - VARCHAR (10), поэтому умножение невозможно.
y434y

-2
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, решит эту проблему.

я не тестировал на скорость


-3

Я позаимствовал идеи выше. Это не быстро и не элегантно. но это точно.

КЕЙС

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 

КОНЕЦ


Также нельзя допускать более 3 нулей.
JoeFletch

-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

1
Вы должны давать объяснения своими ответами, а не просто фрагментом кода. Кроме того, отформатируйте код как код (есть кнопка в верхней части текстового поля).
Дэвид Хейман

-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

Это должно сработать.


2
Для sql server нет перегрузки.
BillRob 01

В PostgreSQL достаточно написать select trim(leading '0' from '001A');, но OP запрашивал SQL Server.
y434y
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.