SQL 替换字符串中的多个不同字符
SQL Replace multiple different characters in string
我需要替换字符串中的多个字符。结果不能包含任何“&”或任何逗号。
我目前有:
REPLACE(T2.[ShipToCode],'&','and')
但是如何放入多个值呢?
非常感谢!
您只需以菊花链方式连接它们:
REPLACE(REPLACE(T2.[ShipToCode], '&', 'and'), ',', '')
我们使用一个函数来执行类似的循环遍历字符串的操作,尽管这主要是为了删除不在“@ValidCharacters”字符串中的字符。这对于删除我们不想要的任何内容很有用 - 通常是非字母数字字符,但我认为我们在该字符串中也有 space、引号、单引号和其他一些字符。它确实用于删除有时会潜入的非打印字符,因此可能不适合您的情况,但可能会给您一些想法。
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
一条评论提到"dozens of replace calls"...如果删除几十个单个字符,您还可以使用翻译和单个替换。
REPLACE(TRANSLATE(T2.[ShipToCode], '[];'',$@', '#######'), '#', '')
如果您使用 SQL Server 2017 或 2019,您可以使用 TRANSLATE 功能。
TRANSLATE(ShipToCode, '|+,-', '____')
在这个例子中,de pipe, plus, comma en minus 都被下划线代替了。
您可以用自己的角色更改每个角色。
所以在下一个例子中,加号和减号被哈希替换。
TRANSLATE(ShipToCode, '|+,-', '_#_#')
只需确保两组中的字符数相同即可。
如果您需要精细控制,缩进格式化 REPLACE()
嵌套以提高可读性。
SELECT Title,
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(RTRIM(Title),
' & ',''),
'++', ''),
'/', '-'),
'(',''),
')',''),
'.',''),
',',''),
' ', '-')
AS Title_SEO
FROM TitleTable
希望这对大家有帮助
如果您想用空字符串替换字符串中的多个单词或字符(即要删除字符),请使用 regexp_replace()
而不是多个 replace()
子句。
SELECT REGEXP_REPLACE("Hello world!123SQL$@#$", "[^\w+ ]", "")
上面的查询会returnHello world123SQL
如果您想从字符串中删除多个单词,将应用相同的过程。
如果要从字符串 Hello World SQL
中删除 Hello
和 World
,则可以使用此查询。
SELECT REGEXP_REPLACE("Hello World SQL", "(Hello|World)", "")
这将 return SQL
通过这个过程,查询将不会显得多余,您也不必处理多个 replace()
子句。
结论
如果您想用空白字符串替换单词,请使用 REGEXP_REPLACE()
。
如果您想用其他词替换单词,例如将 &
替换为 and
,则使用 replace()
。如果有多个单词需要替换,使用多个嵌套replace()
.
我需要替换字符串中的多个字符。结果不能包含任何“&”或任何逗号。
我目前有:
REPLACE(T2.[ShipToCode],'&','and')
但是如何放入多个值呢?
非常感谢!
您只需以菊花链方式连接它们:
REPLACE(REPLACE(T2.[ShipToCode], '&', 'and'), ',', '')
我们使用一个函数来执行类似的循环遍历字符串的操作,尽管这主要是为了删除不在“@ValidCharacters”字符串中的字符。这对于删除我们不想要的任何内容很有用 - 通常是非字母数字字符,但我认为我们在该字符串中也有 space、引号、单引号和其他一些字符。它确实用于删除有时会潜入的非打印字符,因此可能不适合您的情况,但可能会给您一些想法。
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
一条评论提到"dozens of replace calls"...如果删除几十个单个字符,您还可以使用翻译和单个替换。
REPLACE(TRANSLATE(T2.[ShipToCode], '[];'',$@', '#######'), '#', '')
如果您使用 SQL Server 2017 或 2019,您可以使用 TRANSLATE 功能。
TRANSLATE(ShipToCode, '|+,-', '____')
在这个例子中,de pipe, plus, comma en minus 都被下划线代替了。 您可以用自己的角色更改每个角色。 所以在下一个例子中,加号和减号被哈希替换。
TRANSLATE(ShipToCode, '|+,-', '_#_#')
只需确保两组中的字符数相同即可。
如果您需要精细控制,缩进格式化 REPLACE()
嵌套以提高可读性。
SELECT Title,
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(RTRIM(Title),
' & ',''),
'++', ''),
'/', '-'),
'(',''),
')',''),
'.',''),
',',''),
' ', '-')
AS Title_SEO
FROM TitleTable
希望这对大家有帮助
如果您想用空字符串替换字符串中的多个单词或字符(即要删除字符),请使用 regexp_replace()
而不是多个 replace()
子句。
SELECT REGEXP_REPLACE("Hello world!123SQL$@#$", "[^\w+ ]", "")
上面的查询会returnHello world123SQL
如果您想从字符串中删除多个单词,将应用相同的过程。
如果要从字符串 Hello World SQL
中删除 Hello
和 World
,则可以使用此查询。
SELECT REGEXP_REPLACE("Hello World SQL", "(Hello|World)", "")
这将 return SQL
通过这个过程,查询将不会显得多余,您也不必处理多个 replace()
子句。
结论
如果您想用空白字符串替换单词,请使用 REGEXP_REPLACE()
。
如果您想用其他词替换单词,例如将 &
替换为 and
,则使用 replace()
。如果有多个单词需要替换,使用多个嵌套replace()
.