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

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

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

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

【问题讨论】:

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

标签: sql-server sql-server-2005 query-optimization


【解决方案1】:

【讨论】:

  • 虽然有效,但遗憾的是大多数商店不允许 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,所以可能代码有错误

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

      【讨论】:

        猜你喜欢
        • 2016-01-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多