从具有变化模式的记录中分离字符串

时间:2018-12-20 06:18:49

标签: sql sql-server substring

我在excel文件中有这样的数据。作为示例,我仅在此处发布2条记录作为示例,总共有10000条这样的记录。

1) 8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006
2)Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865
Fax: (905) 827-3583

这些字符串在PRIMARY PRACTICE LOC列下的单个单元格中。现在,我只想从这些记录中提取传真号码。手动执行不是一种选择,因为有很多方法。我了解SQL的基础知识,因此,如果有人可以帮助我提出一个查询,该查询只能从这些记录中提取传真号码,然后将其放在新的列中,将有助于我进一步开展我的项目,因为我被困在这里。我在线搜索并找到了SQL的子字符串和拆分字符串函数,但对如何在此处使用它们一无所知。关于如何解决此问题的任何指导都将是很好的。

5 个答案:

答案 0 :(得分:1)

说明: 我使用CHARINDEX查找单词Fax在行中的位置,然后使用SUBSTRING函数从charindex函数(第二个参数)返回的值中提取行中的所有内容(第一个参数到子字符串) )到最后,使用字符串的长度作为最后一个参数

See live demo

create table yourtable ([PRIMARY PRACTICE LOC] nvarchar(max));
insert into yourtable values
('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006'),
('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865 Fax: (905) 827-3583');

select 
 Fax=
     CASE 
       WHEN CHARINDEX('Fax',[PRIMARY PRACTICE LOC])=0 THEN NULL -- case added when no Fax word in string
       ELSE SUBSTRING([PRIMARY PRACTICE LOC],CHARINDEX('Fax',[PRIMARY PRACTICE LOC]),LEN([PRIMARY PRACTICE LOC]))
     END
from yourtable

答案 1 :(得分:0)

如果您要格式化该表python可以完成这项工作,建议您使用像python这样的简单编程语言来完成这项任务

  1. 包裹孔串
  2. 检测关键词,例如电话和传真,在此阶段,您应具有3个元素,例如[8984 Beachwood Rd Wasaga Beach ON L9Z 2X8, Phone: (705) 422-1000,Fax: (705) 422-1006 ]
  3. 然后在python中将python库以所需的格式插入

我还发现以下链接很有用:

  

https://www.extendoffice.com/documents/excel/3639-excel-extract-part-of-string.html

答案 2 :(得分:0)

您也可以使用正确的功能执行此操作,假设传真始终是该列中的最后一个值,

declare @table table(
[PRIMARY PRACTICE LOC] varchar(max))

insert into @table
values('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006'),('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865
Fax: (905) 827-3583')

SELECT
RIGHT([PRIMARY PRACTICE LOC],len([PRIMARY PRACTICE LOC])-CHARINDEX('Fax',[PRIMARY PRACTICE LOC])-3) as Fax
from  @table

答案 3 :(得分:0)

您可以使用index.jsSUBSTRINGPATINDEX功能来查找传真号码的起始位置(即搜索Fax:模式),并在传真之后找到空格数字并复制它们之间的子字符串。

select *, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1))
from (values
('8984 Beachwood Rd Wasaga Beach ON L9Z 2X8 Phone: (705) 422-1000 Fax: (705) 422-1006 '),
('Bronte Health Centre 78 Jones Street Oakville ON L6L 6C5 Phone: (905) 827-9865 Fax: (905) 827-3583')) data(row)
cross apply (select PATINDEX('%Fax: %', data.row) as idx) fax
cross apply (select CHARINDEX(' ', data.row, fax.idx + 15) as idx) SpaceAfter

第一个叉号将在Fax:的文本处找到。我们将在此索引之后开始复制5个字符。第二个叉号在传真号码后找到空格。如果没有空格,IIF函数将复制,告诉SUBSTRING复制下一个20个符号。

当然,您可以添加其他验证,例如根本没有Fax:文本:

IIF(fax.idx = 0, null, SUBSTRING(data.row, fax.idx + 5, IIF(SpaceAfter.idx < 1, 20, SpaceAfter.idx - 1)))

答案 4 :(得分:-1)

我建议您在excel上执行此操作,然后导入到DB(如果需要)

只需转到数据=>文本到列 然后按冒号分隔,并在列中稍作调整。

它将更快。

enter image description here