代码之家  ›  专栏  ›  技术社区  ›  Pat Doyle

SQL-提取两个字符之间的子字符串

  •  2
  • Pat Doyle  · 技术社区  · 7 年前

    我正试图从数据库中的长字符串中提取出一个城市的名称。下面是几个不同位置的数据的外观示例。

    "701 MONROE STREET NW RUSSELLVILLE, AL 35653 (34.514971, -87.736372)"
    "1825 HOLTVILLE ROAD WETUMPKA, AL 36092 (32.558544, -86.221265)"
    

    我想为这个城市的名字创建一个列。我的想法是把fir逗号的左边和后面空格的右边都拿走。我试过几种不同的方法来解决这个问题,但是我可能遗漏了一些东西。

    SELECT  left(Location, CHARINDEX(',', location)) as city FROM table
    

    "701 MONROE STREET NW RUSSELLVILLE,
    "1825 HOLTVILLE ROAD WETUMPKA,
    

    但是现在我想返回这个字符串中逗号左边的所有内容和最后一个空格右边的所有内容,我很难理解如何正确地提取这些信息。任何帮助都将不胜感激。

    谢谢, 拍打

    2 回复  |  直到 7 年前
        1
  •  3
  •   Koen    7 年前

    使用“反向”可以处理以下内容:

    SELECT reverse(
                left(
                 reverse(
                   left(
                     Location, 
                     CHARINDEX(',', location)-1
                   )
                  ),
                  CHARINDEX(' ', reverse(
                     left(
                       Location, 
                       CHARINDEX(',', location)-1
                     )
                   )
                 )
               )
      )as city FROM table;
    

    Fiddle

        2
  •  3
  •   John Cappelletti    7 年前

    如果我在上面的评论中提到的Google API不是一个选项。您可以下载(甚至购买)邮政编码数据库。费用是名义上的。我建议每季度更新一次,因为邮政编码会随着时间而变化(添加/编辑/删除)

    例子

    Declare @YourTable table (id int,addr varchar(250))
    Insert Into @YourTable values
    (1,'701 MONROE STREET NW RUSSELLVILLE, AL 35653 (34.514971, -87.736372)'),
    (2,'1825 HOLTVILLE ROAD WETUMPKA, AL 36092 (32.558544, -86.221265)')
    
    Select A.ID
          ,StreetAddress =left(addr,nullif(charindex(Z.CityName,addr),0)-1)
          ,Z.CityName
          ,Z.StateCode
          ,Z.ZIPCode
     From @YourTable A
     Join [dbo].[OD-Zip] Z 
       on Z.ZipCode = substring(addr,nullif(patindex('%[0-9][0-9][0-9][0-9][0-9]%',addr),0),5)
          and charindex(Z.CityName,addr)>0
          and Z.ZipType='S'
          and Z.CityType='D'
    

    退换商品

    ID  StreetAddress           CityName        StateCode   ZIPCode
    1   701 MONROE STREET NW    Russellville    AL          35653
    2   1825 HOLTVILLE ROAD     Wetumpka        AL          36092