【问题标题】:Address Parsing - Floor #地址解析 - 楼层 #
【发布时间】:2017-08-01 16:37:27
【问题描述】:

我有一些地址数据需要解析。大多数地址信息都以对我有用的方式出现,除了楼层数据。

对于我以不同方式获得的楼层数据,我可能会得到以下格式:

“123 Main Street Floor 2”或“123 Main Street 2nd Floor”

如果我使用 case...when 语句来解析我的数据,我如何获取它来确定何时获取之后的数字或之前的数字?最终我想要“Floor 2”例如 1 和“2nd Floor”例如 2。

这是我目前使用的sql。

CASE WHEN (addr LIKE 'floor%' and addr LIKE '%[0-9]%' ) THEN SUBSTRING(addr, CHARINDEX('Floor ', addr), 
LEN(addr))

【问题讨论】:

  • 这个123 Main Street first floor怎么样
  • 我建议在用户界面解决这个问题。否则数量或排列组合太大。
  • 是的,在输入时解析它,或者解析当前数据集并将结果存储在表中。
  • 我并不担心获得所有组合,只是我上面列出的示例。其他实例的数量太少,无需担心。

标签: sql sql-server tsql ssms


【解决方案1】:

另一个使用 PatIndex() 和的选项

示例

Declare @YourTable table (addr varchar(50))
Insert into @YourTable values
 ('123 Main Street Floor 2')
,('123 Main Street 2nd Floor')
,('123 Main Street')

select *
       ,FloorNr = NullIf(ltrim(rtrim(substring(addr,patindex('%Floor [1-9]%',addr)+patindex('% [1-9]% Floor',addr),25))),addr)
From @YourTable 

退货

addr                        FloorNr
123 Main Street Floor 2     Floor 2
123 Main Street 2nd Floor   2nd Floor
123 Main Street             NULL

【讨论】:

    【解决方案2】:

    好吧,既然你说你只对上面的例子感兴趣......

    declare @table table (addresses varchar(4000))
    
    insert into @table
    values
    ('123 Main Street Floor 2'),
    ('123 Main Street 2nd Floor')
    
    select
        case 
            when right(addresses,5) = 'Floor' then right(addresses,CHARINDEX(' ',reverse(addresses),7)) 
            else substring(addresses,charindex('Floor',addresses,1),99) end
    from
        @table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2012-11-15
      • 2015-09-14
      相关资源
      最近更新 更多