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.

Tim C.
quelle
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)
Ian Horwill
quelle
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')
MTZ
quelle
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.

Nat
quelle
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
ekc
quelle
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
Kathryn Wilson
quelle
2

Sie können dies verwenden:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')
Stelian
quelle
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)) 
Shailendra Mishra
quelle
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
Vikas
quelle
0

Falls Sie die führenden Nullen aus einer Zeichenfolge mit unbekannter Größe entfernen möchten.

Sie können den Befehl STUFF verwenden.

Hier ist ein Beispiel, wie es funktionieren würde.

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

Sehen Sie in Fiddler verschiedene Szenarien, die es abdecken wird

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

Frank Chen
quelle
-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.

Afzal
quelle
3
Wie genau beantwortet dies die Frage?
deutschZuid
-2

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

Madhurupa Moitra
quelle
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).

Krin
quelle
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

Speck
quelle
-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

Brian Ellison
quelle
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
Lynn Caveny
quelle
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.

user3809240
quelle
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