更好的 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 替换的主要内容,如果未能解决你的问题,请参考以下文章