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


select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
Это будет иметь проблемы, если строка полностью состоит из «0», поскольку она никогда не будет соответствовать символу, отличному от «0».
Истинный. В этом случае он вернет всю неизмененную строку нулей. Если это проблема, возвращаемое значение patindex должно быть проверено на ноль.
@Zapnologica: Нет. Вам нужно будет поместить это в оператор «обновить TableName, установить ColumnName = ...».
Конечно, если вы используете операторы обновления.
Прежде чем использовать это решение, попробуйте изучить ответ Арво размещено здесь
Если вы хотите, чтобы запрос возвращал 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')
Это не удастся, если в значении есть пробел. Пример: «0001 B» должно стать «1 B», но вместо этого станет «10B».
Как упоминалось в @Omaer, это небезопасно, если в строке есть пробелы. Улучшенное решение - сначала замените пробелы на char, который вряд ли попадет на ввод, а после 0-ltrim восстановите эти символы до пробелов после. В итоге выглядит довольно сложно :( Пример: выберите replace (replace (ltrim (replace (replace ('000309933200,00 USD', '', '|'), '0', '')), '', '0 '),' | ',' ') -> 309933200,00 долларов США
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20),
patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'),
20)), 20)
возвращает N0Z, то есть избавляется от ведущих нулей и всего, что предшествует им.
Как это ведущий 0, если что-то идет перед ним?
Чтобы удалить ведущий 0 из месяца, следующий оператор определенно сработает.
SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8)
Просто замените GETDATE() полем даты в таблице.
Как именно это отвечает на вопрос?
select ltrim('000045', '0') from dual;
LTRIM
-----
45
Это должно сработать.
Для sql server нет перегрузки.
В PostgreSQL достаточно написать select trim(leading '0' from '001A');, но ИТ-служба запрашивала SQL Server.
У меня была такая же потребность, и я использовал это:
select
case
when left(column,1) = '0'
then right(column, (len(column)-1))
else column
end
работает только для одного нуля, плакат просил нулей во множественном числе
Я позаимствовал идеи выше. Это не быстро и не элегантно. но это точно.
ДЕЛО
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
КОНЕЦ
Кроме того, нельзя допускать более трех нулей.
Вы можете использовать это:
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
Вы должны давать объяснения своими ответами, а не просто фрагментом кода. Кроме того, отформатируйте код как код (в верхней части текстового поля есть кнопка).
ты можешь попробовать это
SELECT REPLACE(columnname,'0','') FROM table
Это приведет к удалению 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, вы можете умножить числовой столбец на 1 Например: Выберите (ColumnName * 1)
Чему равно 1A * 1?
что значит 10 * 1 будет?
В вопросе было указано, что тип столбца - VARCHAR (10), поэтому умножение невозможно.
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
В качестве голоса за ответ Дэвида Уокера stackoverflow.com/a/11129399/1635441, пожалуйста, обратитесь к опубликованному ответу Арво: stackoverflow.com/a/662437/1635441