Wie portiere ich LTRIM von Oracle nach SQL Server?


7

Beim Verschieben einer Anwendung von Oracle auf SQL Server habe ich dieses Pseudo-Oracle PL / SQL:

SELECT LTRIM(MyColumn, '-, ') FROM MyTable

Das heißt, ich verwende OracleLTRIM mit einem zweiten Argument, das die Zeichen angibt, die von der linken Seite der Zeichenfolge abgeschnitten werden sollen.

Leider erlaubt mir die T-SQL-Version vonLTRIM nicht, die zu trimmenden Zeichen anzugeben.

Derzeit bin ich ziemlich ahnungslos, wie ich das migrieren soll LTRIM. Ich denke sogar darüber nach, die Ergebnisse in meiner Hosting-C # -Anwendung zu verarbeiten, nachdem ich die gelesen habe MyColumn.

Das sieht für mich ziemlich unelegant aus.

Meine Frage:

Gibt es eine sinnvolle Möglichkeit, eine LTRIMähnliche Funktionalität für T-SQL zu erhalten, um die Zeichen zum Trimmen weiterzugeben?

Bearbeiten 1:

Ich muss ersetzen -, ,und vom Anfang der Zeichenfolge.

Z.B:

   -----, ,,, This is ,- a test,---,

würde dazu führen

This is ,- a test,---,

Bearbeiten 2:

Ich hoffe sehr, dass dies kein XY-Problem ist .

Vielleicht würde das Umschreiben meiner gesamten Abfrage die Notwendigkeit LTRIMinsgesamt beseitigen , obwohl ich mich lieber darauf konzentrieren würde, sie so 1: 1 wie möglich zu portieren und später die Nützlichkeit der zu hinterfragen LTRIM.

Antworten:


4

Nehmen Sie das Suffix der Zeichenfolge ab dem ersten Zeichen, das kein Leerzeichen, Komma oder Bindestrich ist:

declare @str varchar(100) = '   -----, ,,, This is ,- a test,---,'

select  substring(@str,patindex('%[^ ,-]%',@str),len(@str))

Ergebnis:

This is ,- a test,---,

Bitte beachten Sie, dass der Bindestrich, da es sich um ein Sonderzeichen in regulären Ausdrücken handelt, das 'Bereich' bedeutet (z. B. [a-z]), entweder first ( [^- ,]) oder last ( [^ ,-]) sein muss.


1
Kannst du dem Bindestrich nicht einfach mit \ entkommen, um ihn irgendwo zu platzieren?
Majidarif

1
@majdarif - nein, Sie können nicht
David דודו Markovitz

6

Yeehaw.

DECLARE @MyTable TABLE ( MyColumn VARCHAR(100) );

INSERT @MyTable ( MyColumn )
    VALUES ( '-----, ,,, This is ,- a test,---,' );

SELECT *, 
        SUBSTRING(mt.MyColumn, ca.p, LEN(mt.MyColumn))
FROM @MyTable AS mt
CROSS APPLY ( SELECT * 
              FROM (VALUES (PATINDEX ('%[^ ,-]%', MyColumn))
            ) AS x (p) ) AS ca;

3

Ich glaube nicht, dass Sie mit dieser Lösung im Vergleich zu Oracle zufrieden sein werden, ltrimaber sie macht, was Sie wollen.

declare @Pattern varchar(32) = '-, ';

select case when MyColumn like '['+@Pattern+']%'
         then right(MyColumn
          , len(MyColumn)-(patindex('%[^'+@Pattern+']%',MyColumn)-1)
          )
       else MyColumn
       end
from MyTable

Rextester: http://rextester.com/IXOL62563


3

Kann nicht sagen , ob dies die beste Lösung ist, aber dies kann mit erreicht werden SUBSTRING, CHARINDEX, LEFT, LTRIM, und REPLACE. Ich gehe davon aus, dass Sie mit 8000 oder weniger Zeichen arbeiten.

Testcode:

DECLARE @test_string VARCHAR(100) = '   -----, ,,, This is ,- a test,---,';
SELECT SUBSTRING(@test_string, CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z'), 8000);

Ausgabe:

Dies ist ein Test,---,

Nachfolgend finden Sie eine Erläuterung der einzelnen Teile. Ich habe am Ende ein "Z" hinzugefügt, um den Fall zu behandeln, in dem die Zeichenfolge nur die Zeichen enthält, die entfernt werden müssen. Entfernen Sie zuerst alle Kommas:

REPLACE(@test_string + 'Z', ',', '')

Alles entfernen -:

REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')

Gepolsterte Felder von links entfernen:

LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', ''))

Nimm das erste Zeichen, das kein Leerzeichen, Komma oder - ist:

LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1)

Suchen Sie die Position des ersten Zeichens, das kein Leerzeichen, Komma oder - ist:

CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z') 

Nehmen Sie den Teilstring beginnend an der Position, die wir gefunden haben:

SELECT SUBSTRING(@test_string, CHARINDEX(LEFT(LTRIM(REPLACE(REPLACE(@test_string + 'Z', ',', ''), '-', '')), 1), @test_string + 'Z'), 8000);

1
Funktioniert dies, wenn die Zeichenfolge keine anderen Zeichen als Kommas, Leerzeichen und Bindestriche enthält?
Ypercubeᵀᴹ

1
@ ypercubeᵀᴹ Nein, danke für den Fang. Der Code für diesen Fall wurde korrigiert.
Joe Obbish
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.