Удаление начальных нулей из поля в операторе 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
Кэтрин Уилсон
источник
2

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

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
Стелианский
источник
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

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

user3809240
источник
2
Для sql server нет перегрузки.
BillRob 01
В PostgreSQL достаточно написать select trim(leading '0' from '001A');, но OP запрашивал SQL Server.
y434y