【问题标题】:Separating an address string in SQL在 SQL 中分隔地址字符串
【发布时间】:2013-06-26 05:52:02
【问题描述】:

我在一个 sql server 数据库上有一个名为 Houses 的表,该表有一列包含(丹麦)地址。在丹麦,街道名称总是在门牌号之前,如果是公寓,则在公寓信息之前。我想将街道名称和号码分成两个字符串,而忽略公寓信息。我的数据如下所示:

Address
Fisker Vejen 48B, 1.TV
Baunevej 29

因此,有些街道名称超过 1 个单词,有些地址包含公寓信息,有些则没有。一些门牌号码也有非数字字符。我希望它是:

Street_Name      House_Number
Fisker Vejen     48B
Baunevej         29

我可以使用以下代码提取街道名称:

select case when a.NumStart> 0 then LEFT(a.Address,a.NumStart-1) ELSE a.Address END as Street_Name,
    FROM
    (select patindex('%[0-9]%',Address) as [NumStart], Address from Houses) a

但是没有楼层信息我无法获得门牌号。有人可以帮忙吗?

谢谢!

【问题讨论】:

  • ',' 总是介于门牌号和公寓信息之间?
  • 是的,但街道号码也可能包含非数字字符。我刚刚更新了问题。

标签: sql sql-server string


【解决方案1】:

这是一个解决方案:

SELECT *
        ,LEFT(Address,PATINDEX('% [0-9]%',Address)-1)'Street'
        , SUBSTRING(Address,PATINDEX('% [0-9]%',Address)+1,PATINDEX('%[0-9],%',Address+ ',')-PATINDEX('% [0-9]%',Address))'House Number'
FROM T

演示:SQL Fiddle

更新:如果门牌号总是以数字开头,后跟逗号或根本没有,那么这将起作用:

SELECT *
        ,LEFT(Address,PATINDEX('% [0-9]%',Address)-1)'Street'
        , SUBSTRING(Address,PATINDEX('% [0-9]%',Address)+1,PATINDEX('%, %',Address+ ', ')-PATINDEX('% [0-9]%',Address)-1)'House Number'
FROM Table1

演示2:SQL Fiddle2

【讨论】:

  • 它几乎可以工作。它不够通用,因为地址可能是Fisker Vejen 48B, 1.TV,我希望数字是48B
  • 已更新以适应,如果它仍然太死板,您可能需要案例逻辑。
【解决方案2】:

试试这样的:

SELECT
  CASE WHEN  a.NumStart> 0 then LEFT(a.Adresse, a.NumStart-1) ELSE a.Adresse END as Vejnavn,
  Substring(a.adress, a.Numstart, a.Comma - a.Numstart + 1) as HouseNumber
FROM (
  SELECT 
    PATINDEX('%[0-9]%', Adress) as [NumStart], 
    CHARINDEX(',', Adress + ',') as Comma,
    Adresse, 
    Salgsdato 
  FROM Houses) a

【讨论】:

    【解决方案3】:
    SELECT 
      Vejnavn, 
      case when NumEnd > 0 then left(rest,NumEnd-1) else rest end Housenumber 
    FROM ( 
      SELECT 
        *, 
        patindex('%[^0-9A-Z]%',rest) numend 
      FROM (
        SELECT 
          CASE WHEN a.NumStart> 0 THEN LEFT(a.Adresse,a.NumStart-1) ELSE a.Adresse END as Vejnavn,
          CASE WHEN a.NumStart> 0 THEN SUBSTRING(a.Adresse,a.NumStart,100) ELSE '' END rest
        FROM (
          SELECT 
            PATINDEX('%[0-9]%',Adresse) AS [NumStart], 
            Adresse 
          FROM Houses
        ) a
       ) b 
     ) c 
    

    sqlfiddle

    【讨论】:

    • 我的例子有缺陷,因为我忘了提到门牌号码可以包含非数字字符,例如48B,在这种情况下,我希望号码是48B 而不是@987654325 @.
    • 编辑后也可以拾取信件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多