アプリケーションを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
の有用性について質問します。
スペース、カンマ、ハイフン以外の最初の文字から始まる文字列のサフィックスを取得します。
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;
オラクルの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
これが最善の解決策であるかどうかはわかりませんが、これはSUBSTRING
、CHARINDEX
、LEFT
、LTRIM
、および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);