更好的 SQL 替换

Posted

技术标签:

【中文标题】更好的 SQL 替换【英文标题】:Better SQL Replace 【发布时间】:2010-11-29 22:14:02 【问题描述】:

我想知道是否有更好的方法来编写此更新。

update Alumni_Export_New
set phone = replace(replace(replace(replace(phone,'-',''),' ',''),')',''),'(','')
from tbl

我在 MSSQL 2005 中有一个存储过程来清理表中的电话字段,我认为应该有比我现有的更好的方法来执行此操作。

【问题讨论】:

您使用的是什么风格的 SQL? 它不能解决替换“问题”,但您是否考虑过使用触发器来清理存储过程?与您在运行 sp 时使用的任何计划相比,清理会立即发生。 【参考方案1】:

使用CLR integration and Regular Expressions。

【讨论】:

虽然有效,但遗憾的是大多数商店不允许 CLR 功能。【参考方案2】:

如果您真的不喜欢 REPLACE 的外观并且不介意性能下降,您可以考虑将替换逻辑放入用户定义的函数中。否则,您所拥有的可能是您最好的解决方案。

示例:

UPDATE Alumni_Export_New
SET phone = dbo.StripPhoneNumber(phone)
FROM tbl

【讨论】:

我有许多其他查询将同时运行,所以我认为这个 SP 是最好的。我也称这种形式为 Coldfusion 脚本。从应用程序调用时,UDF 相对于 SP 的优势是什么? @MisterBigs - 我只是在考虑替换逻辑本身。您可以保留存储过程,但将该函数作为UPDATE 的一部分调用。我已经更新了要描述的帖子。 替换不会在其他任何地方自行调用,但在此 SP 中,所以我猜不需要 UDF。对我来说它看起来很乱,但我想我会保持原样。 并没有真正改善事情,只是将逻辑移动到一个函数中。如果手动编写 UPDATE/etc 会更容易,但更新格式会很痛苦【参考方案3】:

如果使用 Microsoft SQl Server,您应该编写一个用户定义函数 (UDF) 来执行此操作

【讨论】:

【参考方案4】:

假设这是针对 mysql 的,我认为对于多个参数(例如其他 dbs 中的 TRANSLATE())没有替代 REPLACE() 函数。

【讨论】:

【参考方案5】:

在 Oracle 上,您可以使用翻译功能。

update Alumni_Export_New set phone = translate(phone, '- ()', '') from tbl 

【讨论】:

很高兴知道,但 OP 使用 Microsoft SQL Server。 另外,不是直接替换 OP 的查询 - 它替换每个字符,而不是所有字符。【参考方案6】:

如果您只需要 i 中的数字字符,您是否考虑过对所有字符串进行循环

    CREATE FUNCTION fn_retun_only_numbers
(
    @myOrgString varchar(50)
)
RETURNS  varchar(50)
AS
BEGIN
    declare @lenOfString int, @i int
    declare @oneChar varchar(1),@newString varchar(50)


    set @lenOfString = (select len(@myOrgString))
    set @i = 1
    set @newString= ''

    while  (@lenOfstring>=@i)
    begin
    set @oneChar = substring(@myOrgString,@i,1)

if ((@oneChar)in ('0','1','2','3','4','5','6','7','8','9'))
begin
set @newString=@newString+@oneChar
end
set @i=@i+1
end
return @newString
END
GO

正如其他人提到的,你现在可以

update Alumni_Export_New
set phone = dbo.fn_retun_only_numbers(phone)
from tbl

我家里没有 SQL,所以可能代码有错误

这可能不是最好的解决方案,但如果您需要确保始终只获得数字 也许这是一种可能的方法

【讨论】:

以上是关于更好的 SQL 替换的主要内容,如果未能解决你的问题,请参考以下文章

Golang SQL 查询变量替换

SQL查询替换通配符文本? [复制]

SQL查询替换通配符文本? [复制]

SQL表中字符串相互替换的优化方式

Netezza SQL - 如何用条件替换两个逗号之间的字符串

SQL SERVER - 选择下一行值最多 5 个字符,然后用新字符替换第一个字符