繁体   English   中英

SQL从字符串中提取值

[英]SQL Extract Values from a String

如何从字符串中提取值? 我正在尝试分成3个新列。 城市,州和邮政编码的单独列。

我试过了

select address2,
left(address2, charindex('',address2)-1)
from table

和-当我尝试下面的代码时,我收到“传递给左侧或子字符串函数的无效长度参数”

,LTRIM(substring(a.Address2, CHARINDEX(' ', a.Address2)+1, CHARINDEX(' ', substring(a.address2, charindex(' ',
a.address2)+1, len(a.address2)))-1))

我可以使用以下代码来划分城市(西沃里克除外),但不确定如何使它适用于州和邮编。 这也消除了错误。

SUBSTRING(Address2,1,CHARINDEX(' ', a.address2+ ' ')-1) as city

有什么想法可以尝试吗?

在此处输入图片说明

看起来您的邮政编码和您的州长都相同。 如果是这样,那么您应该可以使用如下代码:

SELECT
    LEFT(a.Address2,LEN(a.Address2) - 13) AS City,
    RIGHT(LEFT(a.Address2,LEN(a.Address2) - 11),2) AS State,
    RIGHT(a.Address2,10) AS Zip_Code
FROM
    table;

演示代码

创建表和数据:

CREATE TABLE MyTable (Address2 VARCHAR(100));

INSERT INTO MyTable
VALUES
    ('SAN DIEGO CA 92128-1234'),
    ('WEST WARWICK RI 02893-1349'),
    ('RICHMOND IN 47374-9409');

查询:

SELECT
    LEFT(Address2,LEN(Address2) - 13) AS City,
    RIGHT(LEFT(Address2,LEN(Address2) - 11),2) AS State,
    RIGHT(Address2,10) AS Zip_Code
FROM
    MyTable;

输出:

在此处输入图片说明

由于只有三部分(城市/州/邮政编码),因此可以利用SQL Server 2008及更高版本中称为parsename的功能。 (该函数的初衷是解析对象名称。)

结合使用replaceparsename函数,即使状态长度(不太可能)或邮政编码(更可能是)发生变化,也可以将数据分为3部分。

示例数据:

create table #my_table
    (
        address2 varchar(75) not null
    )

insert into #my_table values ('CONNERSVILLE IN 47331-3351')
insert into #my_table values ('WEST WARWICK RI 02893-1349')
insert into #my_table values ('RICHMOND IN 47374-9409')
insert into #my_table values ('WILLIAMSBURG IN 47393-9617')
insert into #my_table values ('FARMERSVILLE OH 45325-9226')
--this record is an example of a likely scenario for when the zip length would change.
insert into #my_table values ('WILLIAMSBURG IN 47393')

解:

with len_vals as 
    (
        select t.address2
        , len(parsename(replace(t.address2,' ','.'), 1)) as zip_len
        , len(parsename(replace(t.address2,' ','.'), 2)) as st_len
        from #my_table as t
        group by t.address2
    )
select left(a.address2, len(a.address2) - b.zip_len - b.st_len  - 2) as city
, substring(a.address2, len(a.address2) - b.zip_len - 2, b.st_len) as st
, right(a.address2, b.zip_len) as zip_code
from #my_table as a
inner join len_vals as b on a.address2 = b.address2

结果:

exampleDataResults

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM