Видалення початкових нулів з поля в операторі SQL


98

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

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


3
Як upvote на Девіда Уолкера stackoverflow.com/a/11129399/1635441 відповідь, будь ласка , зверніться до відповіді Арво, розміщеної: stackoverflow.com/a/662437/1635441
ramizmoh

Відповіді:


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

8
У цьому виникнуть проблеми, коли рядок повністю складається з "0", оскільки він ніколи не буде відповідати символу, який не "0".
Кейд Ру

Правда. У цьому випадку він поверне весь немодифікований рядок нулів. Якщо це проблема, повернене значення patindex доведеться перевірити проти нуля.
Ян Горвілл,

@Zapnologica: Ні. Вам довелося б помістити його в операторі "оновлення табличного імені набору ColumnName = ...".
Ian Horwill

Звичайно, якщо ви використовуєте відомості про оновлення.
Шрівастав

1
Перш ніж використовувати це рішення, спробуйте вивчити відповідь Arvo, опубліковану тут
OscarSosa

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

Я отримав "Функція заміни вимагає 3 аргументів." Я вважаю, що він повинен читати select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
brentlightsey

5
Це не вдасться, якщо значення має пробіл. Приклад: "0001 B" має стати "1 B", але замість цього стане "10B".
Omaer

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)

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


5
Як це початкове 0, якщо щось перед цим?
xxbbcc

4

У мене була та сама потреба, і я використовував це:

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

3

Якщо ви хочете, щоб запит повернув 0 замість рядка нулів або будь-якого іншого значення, ви можете перетворити це на випадок типу, як це:

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 незалежно від його положення. Питання задається лише провідними.
Суніл

-2

Щоб видалити провідну 0, Ви можете помножити стовпець чисел на 1 Напр .: Виберіть (Ім'я стовпця * 1)


3
Чому дорівнює '1А' * 1?
Джонатан Рис,

що буде 10 * 1?
RATAN KUMAR

У питанні було зазначено, що тип стовпця - 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-сервера немає перевантаження.
BillRob

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