Entfernen führender Nullen aus einem Feld in einer SQL-Anweisung


98

Ich arbeite an einer SQL-Abfrage, die aus einer SQLServer-Datenbank liest, um eine Extraktdatei zu erstellen. Eine der Anforderungen, um die führenden Nullen aus einem bestimmten Feld zu entfernen, ist ein einfaches VARCHAR(10)Feld. Wenn das Feld beispielsweise '00001A' enthält, muss die SELECT-Anweisung die Daten als '1A' zurückgeben.

Gibt es in SQL eine Möglichkeit, die führenden Nullen auf diese Weise einfach zu entfernen? Ich weiß, dass es eine RTRIMFunktion gibt, aber dies scheint nur Leerzeichen zu entfernen.


3
Als upvote zu David Walker stackoverflow.com/a/11129399/1635441 Antwort finden Sie in Arvos Antwort gepostet: stackoverflow.com/a/662437/1635441
ramizmoh

Antworten:


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

8
Dies hat Probleme, wenn die Zeichenfolge vollständig aus "0" besteht, da sie niemals mit einem Nicht-0-Zeichen übereinstimmt.
Cade Roux

Wahr. In diesem Fall wird die gesamte unveränderte Zeichenfolge von Nullen zurückgegeben. Wenn dies ein Problem ist, muss der Rückgabewert von patindex gegen Null getestet werden.
Ian Horwill

@Zapnologica: Nein. Sie müssten es in eine Anweisung "update TableName set ColumnName = ..." einfügen.
Ian Horwill

Sicher, wenn Sie Update-Anweisungen verwenden.
Srivastav

1
Bevor Sie diese Lösung verwenden, versuchen Sie bitte, die hier veröffentlichte
überprüfen

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

Ich erhielt "Ersetzungsfunktion erfordert 3 Argumente." Ich glaube, es sollte select replace (ltrim (replace (ColumnName, '0', '')), '', '0')
lauten

5
Dies schlägt fehl, wenn der Wert ein Leerzeichen enthält. Beispiel: "0001 B" sollte zu "1 B" werden, wird aber stattdessen zu "10B".
Omaer

1
Wie bei @Omaer erwähnt, ist dies nicht sicher, wenn die Zeichenfolge Leerzeichen enthält. Verbesserte Lösung - Ersetzen Sie zuerst Leerzeichen durch Zeichen, die wahrscheinlich nicht eingegeben werden, und stellen Sie diese Zeichen nach 0-ltrim wieder in Leerzeichen wieder her. Am Ende sieht es ziemlich komplex aus :( Beispiel: Wählen Sie Ersetzen (Ersetzen (ltrim (Ersetzen (Ersetzen ('000309933200,00 USD', '', '|'), '0', '')), '', '0 '),' | ',' ') -> 309933200,00 USD
Robert Lujo

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

Rückgaben N0Z, dh führende Nullen und alles, was vor ihnen liegt, werden entfernt.


5
Wie ist es eine führende 0, wenn etwas davor kommt?
xxbbcc

4

Ich hatte das gleiche Bedürfnis und benutzte dies:

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

3

Wenn Sie möchten, dass die Abfrage eine 0 anstelle einer Nullzeichenfolge oder eines anderen Werts zurückgibt, können Sie dies in eine case-Anweisung wie die folgende umwandeln:

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

2

Sie können dies verwenden:

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

0

Sie können dies versuchen - es besonders darauf nimmt nur entfernen führende Nullen , wenn nötig:

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

Oder Sie können einfach anrufen

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 

0

Hier ist die SQL-Skalarwertfunktion, mit der führende Nullen aus der Zeichenfolge entfernt werden:

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

Das Entfernen der führenden 0 aus dem folgenden Monat wird definitiv funktionieren.

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

Ersetzen Sie einfach GETDATE()durch das Datumsfeld Ihrer Tabelle.


3
Wie genau beantwortet dies die Frage?
deutschZuid

-2

Sie können dies versuchen SELECT REPLACE(columnname,'0','') FROM table


3
Dadurch wird 0 unabhängig von ihrer Position entfernt. Die Frage bezieht sich nur auf führende.
Sunil

-2

Um die führende 0 zu entfernen, können Sie die Zahlenspalte mit 1 multiplizieren. Beispiel: Wählen Sie (Spaltenname * 1).


3
Was bedeutet '1A' * 1?
Jonathan Rys

Was bedeutet 10 * 1?
RATAN KUMAR

In der Frage wurde angegeben, dass der Spaltentyp VARCHAR (10) ist, daher ist eine Multiplikation nicht möglich.
y434y

-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

Dies ist ein SQL-Skript, das die Funktionalität des TRIM-Befehls in tsql vor 2017 emuliert. Es entspricht im Wesentlichen den anderen Empfehlungen, die anderen werden jedoch durch ein einzelnes ungewöhnliches Zeichen ersetzt, das immer noch vorkommen kann: '[Rtrim]' oder '[ Ltrim] 'könnte immer noch im Text vorkommen, aber das Ersetzen des Hutes durch einen eindeutigen Text, zum Beispiel ein Guid, würde dieses Problem lösen.

Ich habe es nicht auf Geschwindigkeit getestet


-3

Ich habe mir die obigen Ideen geliehen. Das ist weder schnell noch elegant. aber es ist genau.

FALL

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 

ENDE


Es ist auch nicht dynamisch, mehr als 3 Nullen zuzulassen.
JoeFletch

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

1
Sie sollten mit Ihren Antworten eine Erklärung geben, nicht nur einen einzelnen Code-Ausschnitt. Bitte formatieren Sie den Code auch als Code (oben im Texteingabefeld befindet sich eine Schaltfläche).
David Heyman

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

LTRIM
-----
45

Das sollte reichen.


2
Es gibt keine Überlastung für SQL Server.
BillRob

In PostgreSQL ist es genug zu schreiben select trim(leading '0' from '001A');, aber OP hat nach SQL Server gefragt.
y434y
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.