如何在 sql 服务器中 trim 字符串(带有表意文字 space U+3000)?
How to trim string (with Ideographic space U+3000) in sql server?
我必须 trim 日语字符串,它在字符串的开头和字符串的结尾都有双字节 space。
我必须通过 SQL 服务器 2016 的程序来执行此操作。
例如,
SELECT LTRIM(RTRIM(' A A '))
上面一个是完美的
但问题出在风箱线
SELECT LTRIM(RTRIM(' A A '))
我想要上面的输出是'A A'
知道怎么做吗?
改编自 OP 的 SQL post:
SELECT LTRIM(RTRIM(REPLACE(' A A ', ' ', ' ')))
结果截图:
该字符串中的 space 是 Ideographic space (U+3000) Unicode 字符,LTRIM 和 RTRIM 无法识别为白色space。除非明确指定,否则 SQL Server 2017 中的 TRIM 也不会识别它。
另一个问题是这个字符超出了正常的字符范围,不能出现在varchar
字段或值中。这会导致 SQL 服务器版本之间的结果不一致。在 SQL Server 2014 中,它甚至会显示为 ?
。在更高版本中,LTRIM/RTRIM 可能会或可能不会在不发出错误字符的情况下工作。我无法访问所有版本来对此进行测试。
在 SQL Server 2017 中可以明确指定修剪字符,例如:
select trim(N' ' from N' A A ')
这会产生 A A
。
在以前的版本中,PATINDEX
可以用来查找第一个和最后一个非space位置的位置:
declare @str nvarchar(10)=N' A A ';
declare @start int=PATINDEX(N'%[^ ]%',@str)
declare @end int=PATINDEX(N'% ',@str)
SELECT SUBSTRING(@str,@start,@end-@start)
模式N'%[^ ]%'
查找字符串中的第一个非U+3000 字符。 N'%∀' 找到最后一个的位置。 SUBSTRING(@str,@start,@end-@start)
提取两个位置之间的内容。
结果是:
A A
我有解决办法
非常感谢你的努力。
请使用此函数删除双字节space。
创建函数 [RTRIMBYTE](@AV_VALUE NVARCHAR(MAX))
RETURNS NVARCHAR(最大值)
作为
开始
DECLARE @AV_RETURN NVARCHAR(MAX) = @AV_VALUE;
WHILE DATALENGTH(@AV_RETURN) > 0 AND RIGHT(@AV_RETURN, 1) in (' ', ' ')
SET @AV_RETURN = LEFT(@AV_RETURN, LEN('X' + @AV_RETURN + 'X') -3 ) ;
RETURN @AV_RETURN;
结束;
我必须 trim 日语字符串,它在字符串的开头和字符串的结尾都有双字节 space。 我必须通过 SQL 服务器 2016 的程序来执行此操作。
例如,
SELECT LTRIM(RTRIM(' A A '))
上面一个是完美的
但问题出在风箱线
SELECT LTRIM(RTRIM(' A A '))
我想要上面的输出是'A A'
知道怎么做吗?
改编自 OP 的 SQL post:
SELECT LTRIM(RTRIM(REPLACE(' A A ', ' ', ' ')))
结果截图:
该字符串中的 space 是 Ideographic space (U+3000) Unicode 字符,LTRIM 和 RTRIM 无法识别为白色space。除非明确指定,否则 SQL Server 2017 中的 TRIM 也不会识别它。
另一个问题是这个字符超出了正常的字符范围,不能出现在varchar
字段或值中。这会导致 SQL 服务器版本之间的结果不一致。在 SQL Server 2014 中,它甚至会显示为 ?
。在更高版本中,LTRIM/RTRIM 可能会或可能不会在不发出错误字符的情况下工作。我无法访问所有版本来对此进行测试。
在 SQL Server 2017 中可以明确指定修剪字符,例如:
select trim(N' ' from N' A A ')
这会产生 A A
。
在以前的版本中,PATINDEX
可以用来查找第一个和最后一个非space位置的位置:
declare @str nvarchar(10)=N' A A ';
declare @start int=PATINDEX(N'%[^ ]%',@str)
declare @end int=PATINDEX(N'% ',@str)
SELECT SUBSTRING(@str,@start,@end-@start)
模式N'%[^ ]%'
查找字符串中的第一个非U+3000 字符。 N'%∀' 找到最后一个的位置。 SUBSTRING(@str,@start,@end-@start)
提取两个位置之间的内容。
结果是:
A A
我有解决办法 非常感谢你的努力。 请使用此函数删除双字节space。
创建函数 [RTRIMBYTE](@AV_VALUE NVARCHAR(MAX)) RETURNS NVARCHAR(最大值) 作为 开始
DECLARE @AV_RETURN NVARCHAR(MAX) = @AV_VALUE;
WHILE DATALENGTH(@AV_RETURN) > 0 AND RIGHT(@AV_RETURN, 1) in (' ', ' ')
SET @AV_RETURN = LEFT(@AV_RETURN, LEN('X' + @AV_RETURN + 'X') -3 ) ;
RETURN @AV_RETURN;
结束;