我有一个名为 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/