【问题标题】:SQL Replace multiple different characters in stringSQL替换字符串中的多个不同字符
【发布时间】:2017-01-06 22:50:28
【问题描述】:

我需要替换字符串中的多个字符。结果不能包含任何“&”或任何逗号。

我目前有:

REPLACE(T2.[ShipToCode],'&','and')

但是如何将多个值放入?

非常感谢!

【问题讨论】:

  • 使用另一个REPLACE:REPLACE(REPLACE(T2.[ShipToCode],'&','and'),',','')

标签: sql replace sql-server-2016


【解决方案1】:

如果您需要精细控制,它有助于缩进格式化 REPLACE() 嵌套以提高可读性。

SELECT Title,
REPLACE(
    REPLACE(
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(RTRIM(Title),
                            ' & ',''),
                        '++', ''),
                    '/', '-'),
                '(',''),
            ')',''),
        '.',''),
    ',',''),
' ', '-')
AS Title_SEO
FROM TitleTable

【讨论】:

    【解决方案2】:

    如果您使用 SQL Server 2017 或 2019,则可以使用 TRANSLATE 函数。

    TRANSLATE(ShipToCode, '|+,-', '____')
    

    在此示例中,de 管道、加号、逗号和减号均被下划线替换。 您可以使用自己的角色更改每个角色。 所以在下一个例子中,加号和减号被一个散列代替。

    TRANSLATE(ShipToCode, '|+,-', '_#_#')
    

    只需确保两组中的字符数相同即可。

    【讨论】:

      【解决方案3】:

      一条评论提到“几十个替换调用”...如果删除几十个单个字符,您还可以使用翻译和单个替换。

      REPLACE(TRANSLATE(T2.[ShipToCode], '[];'',$@', '#######'), '#', '')
      

      【讨论】:

      • 但是,TRANSLATE 只能从 SQL Server 2017 开始使用。
      • 为什么不直接翻译成空格呢?
      • @Ludovic 因为如果您尝试“TRANSLATE 内置函数的第二个和第三个参数必须包含相同数量的字符”,SQL 会吐出此错误。
      • 是否有性能增益/损失取决于您在单行上使用替换的次数,或单次替换和翻译?
      【解决方案4】:

      我们使用了一个函数来执行类似的遍历字符串的操作,但这主要是为了删除不在“@ValidCharacters”字符串中的字符。这对于删除我们不想要的任何东西很有用——通常是非字母数字字符,尽管我认为我们在那个字符串中也有空格、引号、单引号和一些其他字符。它确实用于删除有时会潜入的非打印字符,因此可能不适合您的情况,但可能会给您一些想法。

      CREATE FUNCTION [dbo].[ufn_RemoveInvalidCharacters]
       (@str VARCHAR(8000), @ValidCharacters VARCHAR(8000))
      RETURNS VARCHAR(8000)
      BEGIN
        WHILE PATINDEX('%[^' + @ValidCharacters + ']%',@str) > 0
         SET @str=REPLACE(@str, SUBSTRING(@str ,PATINDEX('%[^' + @ValidCharacters +
      ']%',@str), 1) ,'')
        RETURN @str
      END
      

      【讨论】:

      • 更喜欢这个解决方案,因为它不会菊花链几十个REPLACE调用
      【解决方案5】:

      您只需要菊花链式连接它们:

      REPLACE(REPLACE(T2.[ShipToCode], '&', 'and'), ',', '')
      

      【讨论】:

      • 很有道理。谢谢。
      • 这太糟糕了,应该允许逗号列表或其他东西,REPLACE(REPLACE(REPLACE 变旧
      猜你喜欢
      • 2021-10-23
      • 2022-12-15
      • 2020-06-02
      • 2020-08-31
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多