web-dev-qa-db-ja.com

LTRIMをOracleからSQL Serverに移植する方法は?

アプリケーションをOracleからSQL Serverに移動すると、次の疑似Oracle PL/SQLができます。

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

つまり OracleのLTRIM を2番目の引数と共に使用して、文字列の左側から切り取る文字を指定しています。

残念ながら、 T-SQLバージョンのLTRIM では、トリミングする文字を指定できません。

現在、私はそのLTRIMをどのように移行するかについては無知です。 MyColumnを読んだ後、ホスティングC#アプリケーションで結果を処理することさえ考えています。

これは私にはどちらかと言えば優雅に見えません。

私の質問:

T-SQLがトリミングする文字を渡すためのLTRIMのような機能を取得する意味のある方法はありますか?

編集1:

-,を文字列の先頭から置き換える必要があります。

例えば。:

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

結果として

This is ,- a test,---,

編集2:

これが XY問題 ではないことを強く願っています。

クエリ全体を書き換えると、LTRIMの必要性が完全になくなるでしょう。ただし、可能な限り1対1に移植することに重点を置き、後でLTRIMの有用性について質問します。

7
Uwe Keim

スペース、カンマ、ハイフン以外の最初の文字から始まる文字列のサフィックスを取得します。

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

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

結果:

This is ,- a test,---,

ハイフンは「範囲」を意味する正規表現の特殊文字であるため、注意してください(例:[a-z])、どちらかが最初でなければなりません([^- ,])または最後([^ ,-])。

イエーホー。

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;
6
Erik Darling

オラクルのltrimと比較して、このソリューションに満足することはないと思いますが、それはあなたが望むことをします。

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/IXOL6256

3
SqlZim

これが最善の解決策であるかどうかはわかりませんが、これはSUBSTRINGCHARINDEXLEFTLTRIM、およびREPLACE。 8000文字以下で作業していると想定しています。

テストコード:

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);

出力:

これはテストです、 - -、

以下は各部の説明です。末尾に「Z」を追加して、削除する必要のある文字のみが文字列に含まれる場合を処理します。最初にすべてのコンマを削除します。

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

すべて削除する -:

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

左側から埋め込みスペースを削除します。

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

スペース、カンマ、または-以外の最初の文字を取得します。

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

スペース、カンマ、または-ではない最初の文字の位置を検索します。

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

見つかった位置から始まる部分文字列を取得します。

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