【问题标题】:SQL Replace IssuesSQL 替换问题
【发布时间】:2020-10-02 16:54:39
【问题描述】:

大家好-

尝试使用替换功能清理数据提取过程中的一些地址问题。

我遇到的问题是,如果街道类型是缩写的,我只想更新地址。

地址 1 需要更新,因此“Ci”变为“Circle”,但我不希望地址 2 以“Circlercle”结尾。

  1. 187624 W Windor Ci
  2. 187624 W Windor Circle
select replace(address, ' Ci', ' Circle')  as address

有时,“Ci”值是字段中的最后一个字符,或者后面可以跟公寓号。我尝试使用“Ci”进行查找,但如果地址字段以“Ci”结尾,仍然缺少地址。

任何想法都非常感谢。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql sql-server


【解决方案1】:

使用 case 表达式使 replace 仅适用于相关记录

select case when address like '% Ci%' and address not like '% Circle%' 
            then replace(address, ' Ci', ' Circle')
            else address end  as address

您也可以使用嵌套替换,假设生成的“Circlercle”不是合法的地址后缀

select replace(replace(address, ' Ci', ' Circle'),'Circlercle','Circle') as address

【讨论】:

  • 感谢您的回复。我确实考虑了您证明的第二个示例,但认为它可能会有点麻烦,因为我将不得不替换多种街道类型。嵌套的替换语句有限制吗?
  • @Chelle 这可能取决于数据库,但我想说 SQL Server 是 32。如果您要考虑更多街道类型,则最好使用 case 表达式。只需将额外的when 添加到其他街道类型。如果它太多,您可以构建一个查找表,其中包含几列指定需要匹配的内容、不需要匹配的内容以及应该替换的内容。然后您只需加入该表并仅使用一个替换
【解决方案2】:

规范化地址比人们想象的要复杂得多。不妨看看Address standardization within a database

如果对 UDF 开放,您可以按照表的定义执行 MULTPLE 替换。下面的例子可以转换成一个函数,我建议表变量是一个实际的表。

示例

Declare @S varchar(max) = '123 NW Bvd.'

Declare @Map table (strFrom varchar(50),strTo varchar(100))
Insert Into @Map values
 ('NW'   ,'Northwest')
,('Blvd' ,'Boulevard')
,('Bvd'  ,'Boulevard')
,('Bvd.' ,'Boulevard')
-- Add as many as needed

Set @S=' '+@S+' '

Select @S=replace(@S,' '+strFrom+' ',' '+strTo+' ')
 From  (Select top 1000 * 
         From  @Map 
         Order By len(strFrom) desc
       ) A
 Order By len(strFrom) desc

退货

123 Northwest Boulevard

【讨论】:

  • 感谢您的回复,约翰!我能够使用替换功能来获得我需要的东西,但这似乎更优雅。打算尝试在我的脚本中使用,如果有的话,至少我会得到一些练习:)
  • @Chelle 总是乐于提供帮助。老实说,这种方法比必须维护代码要强大得多。
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 2013-08-28
  • 2020-08-21
  • 2012-02-15
  • 2015-03-28
  • 2014-06-12
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多