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

时间:2018-08-20 18:12:24

标签: sql sql-server

我正在尝试从数据库中的长字符串中提取城市名称。这是几个不同位置的数据外观示例。

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

我只想为城市名称创建一列。我的想法是将所有内容都用在杉木逗号的左边和右边空格的右边。我尝试了几种不同的方法来解决这个问题,但是我可能会缺少一些东西。

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

这将返回第一个逗号的剩余所有内容。

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

但是现在我想返回逗号的所有内容以及该字符串中最后一个空格的所有内容,因此我对如何正确获取该信息感到困惑。任何帮助,将不胜感激。

谢谢, 帕特

2 个答案:

答案 0 :(得分:3)

使用REVERSE可以与以下方式兼容:

create or replace table x(i int, s string, v variant);
insert into x 
select column1, column2, parse_json(column3) from values
  (1, 'ts1', '[1,2,3]'),
  (2,'ts2','[7,8,9]');

select * from x;
---+-----+------+
 I |  S  |  V   |
---+-----+------+
 1 | ts1 | [    |
   |     |   1, |
   |     |   2, |
   |     |   3  |
   |     | ]    |
 2 | ts2 | [    |
   |     |   7, |
   |     |   8, |
   |     |   9  |
   |     | ]    |
---+-----+------+

select i, s, f.value as newcolumn from x, table(flatten(x.v)) f;
---+-----+-----------+
 I |  S  | NEWCOLUMN |
---+-----+-----------+
 1 | ts1 | 1         |
 1 | ts1 | 2         |
 1 | ts1 | 3         |
 2 | ts2 | 7         |
 2 | ts2 | 8         |
 2 | ts2 | 9         |
---+-----+-----------+

Fiddle

答案 1 :(得分:3)

如果我在上面的评论中提到的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