在sql中替换字符串中的空字符

时间:2010-02-19 17:41:38

标签: sql-server-2005

我需要替换sql字符串中的空字符,我似乎无法找到正确的命令来实现这一点。我使用了replace(myString,'\ 0',''),但这似乎不起作用,任何帮助都会很棒

10 个答案:

答案 0 :(得分:10)

使用此:

REPLACE(myString, char(0), '')

答案 1 :(得分:10)

有效的技巧是在使用REPLACE之前将您的值收集到 Latin1_General_BIN ,并使用 nchar(0x00)COLLATE Latin1_General_BIN 用于 string_pattern

REPLACE(string_expression, string_pattern ,string_replacement)

 select 
 [Terminated]      =          N'123' + nchar(0) + N'567'                                
,[Replaced with -] = REPLACE((N'123' + nchar(0) + N'567') COLLATE Latin1_General_BIN
                                          , nchar(0x00) COLLATE Latin1_General_BIN 
                                                 ,'-')      
,[Removed]        = REPLACE((N'123' + nchar(0) + N'567') COLLATE Latin1_General_BIN
                                    , nchar(0x00)      COLLATE Latin1_General_BIN
                                            ,'')    

以下是结果(使用输出到文本):

Contains   Replaced with -   Removed
---------- ----------------- --------
123 567    123-567           123567

答案 2 :(得分:4)

对于拉丁字符: 选择REPLACE('Ho'+ CHAR(0)+'mer'COLLATE SQL_Latin1_General_CP1_CS_AS,CHAR(0),'')

对于俄罗斯人物: 选择REPLACE(('Го'+ CHAR(0)+'мер')COLLATE Cyrillic_General_BIN,CHAR(0),'')

答案 3 :(得分:2)

我不完全确定你的字符串有什么问题,但是这里有一些要尝试的东西,你使用varchar吗?编辑问题有更多细节:

如果字符串中包含NULL字符:

declare @x varchar(10)
set @x='123'+char(0)+'456'
SELECT @x AS Has_NULL_in_it, REPLACE(@x, char(0), '') AS Has_NULL_removed

输出:

Has_NULL_in_it Has_NULL_removed
-------------- ----------------
123 456        123456

(1 row(s) affected)

如果您无法告诉字符串中的字符,请尝试使用此ASCII:

DECLARE @y varchar(10),@c int
set @y='123'+char(0)+'456'
set @c=0
WHILE @c<LEN(@y)
BEGIN
    SET @c=@c+1
    PRINT CONVERT(varchar(5),@c)+' - '+SUBSTRING(@y,@c,1)+' - CHAR('+CONVERT(varchar(5),ASCII(SUBSTRING(@y,@c,1)))+')'
END

输出:

1 - 1 - CHAR(49)
2 - 2 - CHAR(50)
3 - 3 - CHAR(51)
4 - - CHAR(0)
5 - 4 - CHAR(52)
6 - 5 - CHAR(53)
7 - 6 - CHAR(54)

试试这个unicode:

DECLARE @y nvarchar(10),@c int
set @y='123'+char(0)+'456'
set @c=0
WHILE @c<LEN(@y)
BEGIN
    SET @c=@c+1
    PRINT CONVERT(nvarchar(5),@c)+' - '+SUBSTRING(@y,@c,1)+' - UNICODE('+CONVERT(nvarchar(5),UNICODE(SUBSTRING(@y,@c,1)))+')'
END

如果您的字符串完全为NULL:

declare @z varchar(10)
set @z=NULL
select @z AS IS_NULL, ISNULL(@Z,'') AS NULL_Removed

输出:

IS_NULL    NULL_Removed
---------- ------------
NULL       

(1 row(s) affected)

答案 4 :(得分:2)

如果 ASCII (Char / VarChar)字符串,那么这将起到@DyingCactus建议的作用:

REPLACE(myString, Char(0x00), '')

然而,如果您正在处理Null-Terminated Strings并且正在尝试修复或转换为类似XML的内容,并且您的数据是 Unicode (nChar / nVarChar ),然后用这个:

(CASE WHEN UNICODE(SUBSTRING(myString, LEN(myString), 1)) = 0x0000
      THEN SUBSTRING(myString, 1, LEN(myString) - 1)
      ELSE myString END)

这适用于ASCII(Char / VarChar)和Unicode(nChar / nVarChar)。

注意

对Char(0)或nChar(0)使用Replace()函数将 NOT 用于Unicode(nChar / nVarChar)。
这是SQL Server Replace()函数中的 bug
您可以转换为VarChar,然后使用Replace(),但是您可能会丢失任何您可能要保留的特殊Unicode /非ASCII字符。
否则,您将不会首先使用Unicode数据类型(占用数据的空间的两倍)。

如果你的Unicode字符串中混入了Null-Characters(而不仅仅是在最后),并且出于查询的目的,维护特定于Unicode的字符并不重要,那么作为最后的手段,你可以使用它:

(CASE WHEN myString LIKE (N'%' + nCHAR(0x0000) + N'%')--Has Null-Character(s).
      THEN REPLACE(CAST(myString as VarChar(MAX)), Char(0x00), '')--Cast as ASCII
      ELSE myString END)--Else, leave as Unicode to preserve Unicode-Only chars.

答案 5 :(得分:2)

这些函数从Unicode字符串中删除空字符,至少在SQL Server 2008中是这样。

-- Remove all null characters
CREATE FUNCTION RemoveNulls(@s nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @r nvarchar(max);
    SET @r = REPLACE(@s COLLATE Latin1_General_BIN, NCHAR(0), N'');
    RETURN @r; 
END
-- Remove all characters from the first null character
CREATE FUNCTION TrimNull(@s nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
    DECLARE @r nvarchar(max);
    DECLARE @i int = CHARINDEX(NCHAR(0), @s COLLATE Latin1_General_BIN);
    IF @i = 0
        SET @r = @s;
    ELSE
        SET @r = SUBSTRING(@s, 1, @i - 1);
    RETURN @r; 
END
-- Example usage
DECLARE @s nvarchar(10) = N'Test' + NCHAR(0) + N'!';
SELECT dbo.RemoveNulls(@s), dbo.TrimNull(@s);
--> Test!, Test

在我的例子中,来自ODBC的字段被填充为8000个字符并且为null,而TrimNull比RemoveNulls快得多。

答案 6 :(得分:1)

如果要连接值以使字符串使用IsNull(value, replacement)以避免使用空值或将CONCAT_NULL_YIELDS_NULL设置为ON以避免出现空字符串。

答案 7 :(得分:0)

我们遇到了同样的问题:在nvarchar字段中结束\ 0字符,无法将其替换为任何建议的REPLACE变体(SQL Server 2008)。使用时

LEFT(Bar, LEN(Bar)-1)

它与\ 0!

一起切断了最后一个常规字符

我们现在解决这些领域的解决方案是(在第一眼就看起来很奇怪):

UPDATE Foo
    SET Bar = LEFT(Bar, LEN(Bar))
WHERE RIGHT(Bar, 1) = CHAR(0)

答案 8 :(得分:-1)

解决的例子

CREATE FUNCTION dbo.F_ReplaceNullChar( @STR NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @i INT=0
DECLARE @RET NVARCHAR(MAX)=''
    WHILE @I<LEN(@STR) 
    BEGIN 
        SET @i=@i+1
        IF UNICODE(SUBSTRING(@STR,@i,1)) <> 0x0000
            SET @RET=@RET+SUBSTRING(@STR,@i,1)

    END
    RETURN @RET
END
GO

SELECT LEN(mycol) lenbefore,mycol,
 LEN( dbo.F_ReplaceNullChar(mycol)) lenafter, dbo.F_ReplaceNullChar(mycol) mycolafter 
FROM mytab

答案 9 :(得分:-1)

选择zz.xx ,replace(zz.xx,'�','') 来自( 选择 t.string_with_null, ( 选择s.string_with_null +'' 来自TABLE_1秒 其中s.token_hash = t.token_hash 用于xml路径('') )xx 来自TABLE_1 t(nolock) )zz