如何在SQL Server中修剪字符串(使用表意空格U + 3000)?

时间:2019-12-12 09:34:59

标签: sql sql-server database sql-server-2016

我必须修剪日语字符串,该字符串在字符串的开头和结尾都具有双字节空间。 我必须通过SQL Server 2016的过程来执行此操作。

例如,

SELECT  LTRIM(RTRIM(' A A ')) 

以上是完美的

但是问题出在波纹管

SELECT  LTRIM(RTRIM(' A A '))

我希望以上输出为'A A'

有什么想法,怎么做?

3 个答案:

答案 0 :(得分:1)

该字符串中的空格是Ideographic space(U + 3000)Unicode字符,LTRIM和RTRIM不能将其识别为空格。除非明确指定,否则即使SQL Server 2017中的TRIM也无法识别它。

另一个问题是该字符超出了正常字符范围,并且不能出现在varchar字段或值中。这会导致SQL Server版本之间的结果不一致。在SQL Server 2014中,它甚至会显示为?。在更高的版本中,LTRIM / RTRIM可能会或可能不会不发出错误字符而工作。我无权访问所有版本进行测试。

在SQL Server 2017中,可以显式指定修剪后的字符,例如:

select trim(N' ' from N' A A ')

这将产生A A

在以前的版本中,PATINDEX可用于查找第一个和最后一个非空格位置的位置:

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

答案 1 :(得分:0)

根据OP的帖子改编的SQL:

SELECT LTRIM(RTRIM(REPLACE(' A A ', '  ', ' ')))

结果截图:

enter image description here

答案 2 :(得分:0)

我找到了解决方案 非常感谢您的努力。 请使用此功能删除双字节空间。

创建函数[RTRIMBYTE](@ AV_VALUE NVARCHAR(MAX)) 返回NVARCHAR(MAX) 如 开始

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;

END;