sql-server - 将数据解析为单独的列

标签 sql-server t-sql sql-server-2008

我有一个名为 Physical-address 的列,我需要将其解析为它自己的列,以便我需要将其导入到单独的地址字段中。该列的数据是这样的:

以下是一些示例:

1) 6453 W Church Dr, Summitville, CA, 46741, 布朗

2) 2456 North Street, 格林斯博罗, NC 27403

3) 5847 East Wood Dr, 弗吉尼亚州

4) 530 阿罕布拉博士公寓。 A1 安德森 IN 46012

5) 1511 W 9th St,安德森,印第安纳州,46016

6) 2900 W 22nd St, 安德森, IN, 46013, 麦迪逊

7) 社区医院,1515 N Madison Ave, Anderson, IN, 46011

结果:

1) 46741

2)27403

3) 空

4) 46012

5) 46016

6) 46013

7) 46011

提前致谢!

最佳答案

您可以尝试这个(谢谢,得到了示例数据!)

DECLARE @DataSource TABLE
(
    ID INT IDENTITY,
    [value] NVARCHAR(MAX)
);

INSERT INTO @DataSource ([value])
VALUES ('6453 W Church Dr, Summitville, CA, 46741, Brown')
      ,('2456 North Street, Greensboro, NC 27403')
      ,('5847 East Wood Dr, VA')
      ,('530 Alhambra Dr. Apt. A1 Anderson IN 46012')
      ,('1511 W 9th St, Anderson, IN, 46016')
      ,('2900 W 22nd St, Anderson, IN, 46013, Madison')
      ,('Community Hospital, 1515 N Madison Ave, Anderson, IN, 46011');

--查询将查找字符串中的所有整数并返回所需区间内的整数

SELECT ID,[value]
      ,fragment.value('text()[1]','int')
FROM @DataSource ds
CROSS APPLY(SELECT CAST('<x>' + REPLACE(REPLACE((SELECT [value] AS [*] FOR XML PATH('')),',',' '),' ','</x><x>') + '</x>' AS XML)) A(Casted)
CROSS APPLY A.Casted.nodes('/x[not(empty(. cast as xs:int?))]') B(fragment)
WHERE fragment.value('text()[1]','int') BETWEEN 10000 AND 99999;

一些解释:

第一个 CROSS APPLY 会将所有逗号替换为空格,然后在所有空格处拆分字符串(通过将 a b c 转换为 <x>a</x><x>b</x><x>c</x> )。

神奇的事情发生在第二个 CROSS APPLY 中:
.nodes('/x[not(empty(. cast as xs:int?))]') 将返回片段,其中转换为 xs:int? 不会返回空。换句话说:所有值都是数字。

由于我们只返回数字,因此我们可以在 int 方法中节省地使用 .value() ,因此可以使用 BETWEEN 简单地检查间隔。

更新

感谢 HABO,您可以稍微更改一下:

SELECT ID,[value]
      ,fragment.value('text()[1]','nvarchar(max)')
FROM @DataSource ds
CROSS APPLY(SELECT CAST('<x>' + REPLACE(REPLACE((SELECT [value] AS [*] FOR XML PATH('')),',',' '),' ','</x><x>') + '</x>' AS XML)) A(Casted)
CROSS APPLY A.Casted.nodes('/x[not(empty(. cast as xs:int?))]') B(fragment)
WHERE LEN(fragment.value('text()[1]','nvarchar(max)'))=5;

这个想法仍然是一样的:找到纯数字。但结果被作为字符串处理(不省略前导零),并且过滤器正在检查长度是否为 5。

关于sql-server - 将数据解析为单独的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53604731/

相关文章:

t-sql - 在 TSQL 中,SUM(A + B) 与 SUM(A) + SUM(B) 之间有性能差异吗?

c# - 来自多线程应用程序的数据库表插入锁

sql - 使用 MAX() 更新 TSQL

mysql - 组合 Blackboard 9.1.13 控制台 SQL 查询

sql-server - SQL 报告服务 : First call is very slow

sql - 如何在 SQL Server 中选择前 100 个字符?

sql-server - 将 SQL Server 2000 安全地暴露在 Internet 上

sql - 如果 1 行满足条件,则排除 ID 的所有行

T-SQL 查询批量处理数据而不破坏组

sql-server-2008 - SQL Server 2008 Management Studio 片段