このドキュメントはMSConnectで見つかりました:http:
//connect.microsoft.com/SQLServer/feedback/details/259534/patindex-missing-escape-clause
ESCAPE
ユーザーがで句について質問するとPATINDEX
、別のユーザーもその要求を拡張しCHARINDEX
ます。
MSの回答:修正されないため、チケットはクローズされました:(
私は自分のカスタム関数を書き終えましたLTrim
:
CREATE FUNCTION LTrim_Chars (
@BaseString varchar(2000),
@TrimChars varchar(100)
)
RETURNS varchar(2000) AS
BEGIN
DECLARE @TrimCharFound bit
DECLARE @BaseStringPos int
DECLARE @TrimCharsPos int
DECLARE @BaseStringLen int
DECLARE @TrimCharsLen int
IF @BaseString IS NULL OR @TrimChars IS NULL
BEGIN
RETURN NULL
END
SET @BaseStringPos = 1
SET @BaseStringLen = LEN(@BaseString)
SET @TrimCharsLen = LEN(@TrimChars)
WHILE @BaseStringPos <= @BaseStringLen
BEGIN
SET @TrimCharFound = 0
SET @TrimCharsPos = 1
WHILE @TrimCharsPos <= @TrimCharsLen
BEGIN
IF SUBSTRING(@BaseString, @BaseStringPos, 1) = SUBSTRING(@TrimChars, @TrimCharsPos, 1)
BEGIN
SET @TrimCharFound = 1
BREAK
END
SET @TrimCharsPos = @TrimCharsPos + 1
END
IF @TrimCharFound = 0
BEGIN
RETURN SUBSTRING(@BaseString, @BaseStringPos, @BaseStringLen - @BaseStringPos + 1)
END
SET @BaseStringPos = @BaseStringPos + 1
END
RETURN ''
END
そしてのためにRTrim
:
CREATE FUNCTION RTrim_Chars (
@BaseString varchar(2000),
@TrimChars varchar(100)
)
RETURNS varchar(2000) AS
BEGIN
RETURN REVERSE(LTrim_Chars(REVERSE(@BaseString), @TrimChars))
END
少なくとも、私はいくつかのMsSqlスクリプトを学びました...
編集:
NULL
OracleとPostgresの動作を反映するために、2つの引数のチェックを追加しました。
残念ながら、Oracleの動作はまだ少し異なります。長さ0の文字列はOracleの場合と同様であるため、
を記述した場合はLTRIM(string, '')
、が返されます。実際には、の結果が返されます。NULL
NULL
LTRIM(string, NULL)
NULL
ところで、これは本当に奇妙なケースです。