SQL 문의 필드에서 선행 0 제거


99

추출 파일을 생성하기 위해 SQLServer 데이터베이스에서 읽는 SQL 쿼리를 작업 중입니다. 특정 필드 (단순 VARCHAR(10)필드) 에서 선행 0을 제거하기위한 요구 사항 중 하나입니다 . 예를 들어 필드에 '00001A'가 포함 된 경우 SELECT 문은 데이터를 '1A'로 반환해야합니다.

SQL에서 이런 식으로 선행 0을 쉽게 제거하는 방법이 있습니까? RTRIM기능 이 있다는 것을 알고 있지만 이것은 공백을 제거하는 것 같습니다.


3
David Walker의 stackoverflow.com/a/11129399/1635441 응답에 대한
찬성으로

답변:


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

8
문자열이 "0"이 아닌 문자와 일치하지 않기 때문에 전체적으로 "0"으로 구성되어 있으면 문제가 발생합니다.
Cade Roux

진실. 이 경우 수정되지 않은 모든 0 문자열을 반환합니다. 이것이 문제라면 patindex의 반환 값을 0에 대해 테스트해야합니다.
Ian Horwill 2009

@Zapnologica : 아니요. "update TableName set ColumnName = ..."문에 넣어야합니다.
Ian Horwill 2014 년

물론 업데이트 문을 사용하는 경우.
Srivastav 2014

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"가됩니다.
Omaer

1
@Omaer가 언급했듯이 문자열에 공백이 있으면 안전하지 않습니다. 개선 된 솔루션-먼저 공백을 입력 할 가능성이 낮은 문자로 바꾸고 0-ltrim 후에 이러한 문자를 다시 공백으로 복원합니다. 결국은 매우 복잡해 보입니다. '),'| ',' ')-> 309933200,00 USD
Robert Lujo

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

반환 N0Z, 즉, 앞에 0이 그들 앞에 오는 것을 없애 것이다.


5
앞에 무언가가 오면 어떻게 선행 0입니까?
xxbbcc

4

나는 동일한 필요가 있었고 이것을 사용했습니다.

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

3

쿼리가 0 문자열 또는 해당 문제에 대한 다른 값 대신 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

이를 시도해 볼 수 있습니다 . 필요한 경우 선행 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

다음은 문자열에서 선행 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


-1

다음 달에서 선행 0을 제거하는 것은 확실히 작동합니다.

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

그냥 교체 GETDATE()테이블의 날짜 필드.


3
이것이 질문에 정확히 어떻게 대답합니까?
deutschZuid 2014-08-18

-2

당신은 이것을 시도 할 수 있습니다 SELECT REPLACE(columnname,'0','') FROM table


3
이것은 위치에 관계없이 0을 제거합니다. 질문은 오직 선두적인 것들에 대해서만 묻는 것입니다.
Sunil

-2

선행 0을 제거하려면 숫자 열에 1을 곱할 수 있습니다. 예 : (ColumnName * 1)을 선택합니다.


3
'1A'* 1은 무엇입니까?
Jonathan Rys

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

이것은 2017 년 이전에 tsql에서 TRIM 명령의 기능을 에뮬레이트하는 Sql 스크립트로, 기본적으로 다른 권장 사항과 동일하지만 나머지는 여전히 발생할 수있는 단일 드문 문자 인 '[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 개 이상의 0을 허용하는 것도 동적이 아닙니다.
JoeFletch

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

1
단일 코드 스 니펫이 아니라 답변과 함께 설명을 제공해야합니다. 또한 코드를 코드 형식으로 지정하십시오 (텍스트 입력 상자 상단에 버튼이 있습니다).
David Heyman

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

LTRIM
-----
45

그래야합니다.


2
SQL Server에는 오버로드가 없습니다.
BillRob

PostgreSQL에서는 작성하는 것으로 충분 select trim(leading '0' from '001A');하지만 OP는 SQL Server를 요청했습니다.
y434y
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.