【问题标题】:Grabbing number from text where meets specific critera从符合特定条件的文本中获取数字
【发布时间】:2018-04-09 14:01:38
【问题描述】:

好的,我有一堆数据,所有这些数据都包含文本中的代码,但格式不正确,例如:

Well at Wallgreens 常规强度抗酸剂液体(氧化铝镁二甲硅油抗酸剂和抗气体)薄荷 a)12 盎司瓶 (NDC 0363-0073-02) b) 26 盎司瓶 (NDC 0363-0073-26) 由 Walgreens CO 分销200 Wilmot Rd 迪尔菲尔德 IL 60015

IDPN(透析中肠外营养 - 添加氨基酸的透析液)a) 490mL 袋 b) 500mL 袋和 c) 590mL 袋 Pentec Health Inc 4 Creek Parkway Suite A Boothwyn PA 19061-3132

Aminosyn-PF(氨基酸)7% 无亚硫酸盐 500 mL 袋 仅限 Rx Hospira Inc Lake Forest IL 60045 NDC:0409-4178-03 条形码 (01) 0 030409 417803 5

我只对格式如下的 8-9 位数字感兴趣:

xxxx-xxxx 或 xxxxx-xxxx

我目前通过以下方式选择了这些条目:

WHERE [Product Description] LIKE '%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%' OR [Product Description] LIKE  '%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'

但我想输出它匹配的字符串,而不是整个产品描述,只输出它找到的代码,例如:

0363-0073

19061-3132

0409-4178

【问题讨论】:

  • 在您向我们展示的示例文本中,我实际上没有看到任何匹配项。这是意外吗?
  • 0363-0073-02 是 0363-0073 的匹配项 我对仅前 8/9 的尾随 3 个字符不感兴趣
  • 是否要从同一文本中提取多个值?
  • 也许我不确定目前有 5000 个结果需要分析,所以很可能一对夫妇可能有多个代码,因此选择多个值可能会在此任务中帮助我更进一步

标签: sql-server string pattern-matching sql-like


【解决方案1】:

对于单个值,您可以使用 PATINDEX:

SELECT 
    SUBSTRING(ProductDescription
              ,PATINDEX('%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'
                        ,ProductDescription),
             10), *
FROM t
WHERE 
 [ProductDescription] LIKE '%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%';

DBFiddle Demo

【讨论】:

  • 我不确定这是否适用于连字符前只有 4 位数字的情况
  • @TabAlleman 这是部分解决方案(展示如何使用PATINDEX)如果必须处理第二种情况,您可以使用UNION ALL 或条件逻辑
【解决方案2】:

这是一个稍微不同的方法,它不使用UNION ALL

WITH VTE AS (
    SELECT *
    FROM (VALUES ('Well at Wallgreens Regular Strength Antacid Liquid (Alumina Magnesia Simethicone Antacid & Anti Gas) Mint a)12 oz bottle (NDC 0363-0073-02) b) 26 oz bottle (NDC 0363-0073-26) Distributed by Walgreens CO 200 Wilmot Rd Deerfield IL 60015'),
                 ('IDPN (Intradialytic Parenteral Nutrition - dialysate solution with added amino acids) a) 490mL bag b) 500mL bag and c) 590mL bag Pentec Health Inc 4 Creek Parkway Suite A Boothwyn PA 19061-3132'),
                 ('Aminosyn-PF (amino acids) 7% Sulfite-Free 500 mL Bags Rx Only Hospira Inc Lake Forest IL 60045 NDC: 0409-4178-03 Barcode (01) 0 030409 417803 5')) V(S))
SELECT V.S,
       CASE WHEN PI1.C > 0 THEN SUBSTRING(V.S,PI1.C, 10)
            WHEN PI2.C > 0 THEN SUBSTRING(V.S,PI2.C, 9)
            ELSE NULL
       END AS N
FROM VTE V
     CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%',V.S))) PI1(C)
     CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%',V.S))) PI2(C);

2 个PATINDEX 的原因是因为值12345-6789 将满足模式'%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'。这样首先完成了 10 个字符格式的检查,然后是 9 个字符。如果没有找到任何模式,CASE 表达式也可以避免错误,就像 PI1.CPI2.C 返回 0(意味着未找到模式)然后 NULL返回。

【讨论】:

    【解决方案3】:

    您可以使用以下方法获取任一代码的第一个实例(基于 lad2025 的回答):

    declare @t table (v varchar(8000))
    
    insert @t(v) values ('Well at Wallgreens Regular Strength Antacid Liquid (Alumina Magnesia Simethicone Antacid & Anti Gas) Mint a)12 oz bottle (NDC 0363-0073-02) b) 26 oz bottle (NDC 0363-0073-26) Distributed by Walgreens CO 200 Wilmot Rd Deerfield IL 60015'),
    ('IDPN (Intradialytic Parenteral Nutrition - dialysate solution with added amino acids) a) 490mL bag b) 500mL bag and c) 590mL bag Pentec Health Inc 4 Creek Parkway Suite A Boothwyn PA 19061-3132'),
    ('Aminosyn-PF (amino acids) 7% Sulfite-Free 500 mL Bags Rx Only Hospira Inc Lake Forest IL 60045 NDC: 0409-4178-03 Barcode (01) 0 030409 417803 5')
    
    SELECT  *
    FROM @T
    
    select  substring(v, patindex('%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%', v), 10)
    from    @t
    where   v like '%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'
    union all
    select  substring(v, patindex('%[^0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%', v), 9)
    from    @t
    where   v like '%[^0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-13
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多