【问题标题】:separate a string from records with changing patterns将字符串与模式变化的记录分开
【发布时间】:2018-12-20 06:18:48
【问题描述】:

我在这样的 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 的 substring 和 splitstring 函数,但不知道如何在这里使用它们。关于如何解决这个问题的任何指导都会很棒。

【问题讨论】:

  • 为什么不在 excel 本身中提取这些信息,然后导入数据库?
  • 我想Excel has regular expression capabilities。我只会导出到 CSV,然后使用grep。但是,MS SQL 没有这些:只有模式匹配,没有提取。
  • 您可以在 excel =RIGHT(A1, LEN(A1) - 4 -SEARCH("Fax:", A1)) 中使用这样的函数,其中 A1 是包含数据的单元格

标签: sql sql-server substring


【解决方案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

【讨论】:

  • 感谢您的回答,您的解决方案符合我的要求...如果您能向我解释一下选择查询部分,您会非常好。
  • @zainulabidin 更新了句子中没有传真词的答案,并添加了解释和链接
【解决方案2】:

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

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】:

    您可以使用SUBSTRINGPATINDEXCHARINDEX 函数来查找传真号码的开始位置(即搜索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】:

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

      1. 把孔串包起来
      2. 检测 Phone 和 Fax 等关键词,在这个阶段你应该拥有 3 个元素,如 [8984 Beachwood Rd Wasaga Beach ON L9Z 2X8, Phone: (705) 422-1000,Fax: (705) 422-1006 ]
      3. 然后用python库以期望的格式插入到excel中

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

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

      【讨论】:

        【解决方案5】:

        我建议你在excel上做,然后导入数据库(如果你需要的话)

        只需转到数据 => 文本到列 然后用冒号分隔并在列上玩一下。

        它会更快。

        【讨论】:

        • 可能会出现问题,因为每条记录中的空格数可能会有所不同,从而导致每条记录的列数不同。
        • 正确,所以用冒号
        猜你喜欢
        • 1970-01-01
        • 2013-06-29
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2017-04-26
        • 2012-07-22
        • 2019-03-20
        相关资源
        最近更新 更多