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

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

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

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

ramizmoh 31.01.2013 16:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
101
1
249 379
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Ответ принят как подходящий

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

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

Cade Roux 19.03.2009 17:09

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

Ian Horwill 20.04.2009 13:26

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

Ian Horwill 19.09.2014 19:41

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

Srivastav 22.12.2014 13:11

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

OscarSosa 17.01.2019 17:31

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

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

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

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

brentlightsey 10.01.2013 18:46

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

Omaer 27.05.2014 21:41

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

Robert Lujo 16.06.2016 15:23

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

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

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

xxbbcc 11.07.2014 20:02

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

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

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

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

deutschZuid 18.08.2014 08:23

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

LTRIM
-----
45

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

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

BillRob 01.12.2014 20:52

В PostgreSQL достаточно написать select trim(leading '0' from '001A');, но ИТ-служба запрашивала SQL Server.

y434y 07.08.2020 11:44

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

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

работает только для одного нуля, плакат просил нулей во множественном числе

Uriah Blatherwick 19.11.2020 00:53

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

ДЕЛО

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 

КОНЕЦ

Кроме того, нельзя допускать более трех нулей.

JoeFletch 31.05.2017 20:43

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

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')

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

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

Vivian 29.11.2016 17:31

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

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

Sunil 10.01.2018 05:03

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

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, вы можете умножить числовой столбец на 1 Например: Выберите (ColumnName * 1)

Чему равно 1A * 1?

Jonathan Rys 17.05.2018 18:29

что значит 10 * 1 будет?

RATAN KUMAR 06.09.2019 21:45

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

y434y 07.08.2020 11:36

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

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

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

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

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

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

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

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

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

Другие вопросы по теме