在一次更新中替换多列中的符号

时间:2015-03-12 07:28:55

标签: sql-server

我的SQL脚本中有很多更新语句:

UPDATE DBO.Products SET products_fullTextSearch = REPLACE(products_fullTextSearch, ' ', '')
UPDATE DBO.Products SET products_fullTextSearch = REPLACE(products_fullTextSearch, '°', '')
UPDATE DBO.Products SET products_fullTextSearch = REPLACE(products_fullTextSearch, '±', '')
UPDATE DBO.Products SET products_fullTextSearch = REPLACE(products_fullTextSearch, '\', '')
UPDATE DBO.Products SET products_fullTextSearch = REPLACE(products_fullTextSearch, '/', '')
..............................
etc

我怎么能在一个UPDATE语句中做到这一点?

2 个答案:

答案 0 :(得分:0)

您可以尝试嵌套REPLACE

UPDATE DBO.Products 
    SET products_fullTextSearch = 
    REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(products_fullTextSearch, ' ', ''),'°', ''),
                '±', ''
            ),
            '\', ''
        ),
    '/', ''
    )

答案 1 :(得分:0)

在其他一些RDBMS中,TRANSLATE函数可以承担这项工作的冲击,但是Alas SQL Server没有TRANSLATE等价物。它并没有阻止人们想要它......

CREATE FUNCTION dbo.Translate 
 (
 @Input AS VarChar(1000),
 @Find AS VarChar(100),
 @Replace AS VarChar(100)
 )
 RETURNS VarChar(1000)
AS
BEGIN

 DECLARE @i AS TinyInt

 SELECT @i = 1

 WHILE @i <= LEN(@Find) BEGIN

  SELECT @Input = REPLACE(@Input, SUBSTRING(@Find, @i, 1), SUBSTRING(@Replace, @i, 1))
  SELECT @i = @i + 1

 END
 RETURN @Input
END
GO

DECLARE @String AS VarChar(1000)

SELECT @String = 'pootle_flump'
SELECT @String = dbo.Translate(@String, 'pt', 'xz')

PRINT  @String

来源:http://www.dbforums.com/showthread.php?1216565-Oracle-Translate-function-equivalent-in-SQL-Server

您可以这样使用它:

UPDATE DBO.Products 
SET products_fullTextSearch = REPLACE(dbo.Translate(products_fullTextSearch, '°±\/', '    '), ' ', '')

工作原理:

首先,TRANSLATE会将您不想要的4个字符转换为空格(这也是您不想要的字符)

之后,REPLACE会将所有空格变为空白

翻译的美妙之处在于可以轻松扩展交换字符的数量。翻译采用&#34;发现&#34;的第一个字符。字符串并将其替换为&#34;中的第一个字符替换&#34;串。然后它移动到第二个字符(在查找和替换中)

以下命令:

Translate(input_text, 'abcd', '1234')

会做出这些修改:

'cat' -> '31t'
'dog' -> '4og'
'ffeeddccbbaa' -> 'ffee44332211'

实际上,没有必要使用REPLACE,因为你可以利用&#34; quirk&#34;通过为&#34;替换&#34;提供零长度字符串,子字符串将完成其工作。参数:

UPDATE DBO.Products 
SET products_fullTextSearch = dbo.Translate(products_fullTextSearch, '°±\/ ', '')

因为该功能会尝试在&#34;替换&#34;中找到单个字符。 &#34; find&#34;中每个字符的字符串参数字符串,并且因为&#34; replacement&#34;中没有字符,子字符串将始终返回null(或零长度字符串)作为替换字符,这意味着&#34;找到&#34中的字符; string将被替换为(nothing)