我在 MS Connect 上找到了这份文档:
http ://connect.microsoft.com/SQLServer/feedback/details/259534/patindex-missing-escape-clause
用户询问ESCAPE
with 子句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 的行为。
不幸的是,Oracle 的行为仍然略有不同:
在您编写 的情况下LTRIM(string, '')
,它返回NULL
,因为 0 长度的字符串就像NULL
在 Oracle 中一样,所以它实际上返回的是 的结果LTRIM(string, NULL)
,NULL
确实如此。
顺便说一句,这是一个非常奇怪的案例。