首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从符合特定标准的文本中获取数字

从符合特定标准的文本中获取数字
EN

Stack Overflow用户
提问于 2018-04-09 14:01:38
回答 3查看 48关注 0票数 0

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

在沃格林常规强度抗酸液(氧化铝镁硅甲酮抗酸和防气体)薄荷a)12盎司瓶(NDC 0363-0073-02) b) 26盎司瓶(NDC 0363-0073-26)由Walgreens CO 200 Wilmot Rd Deerfield IL 60015分发。 IDPN (肠外营养-添加氨基酸透析液) a) 490 PA袋b) 500 PA袋和c) 590 PA袋Pentec健康公司4溪公园套房A Boothwyn PA 19061-3132 氨基酸-PF(氨基酸) 7%亚硫酸盐-不含500个mL袋Rx只有Hospira公司湖森林IL 60045 NDC: 0409-4178-03条形码(01) 0 030409 417803 5

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

xxxx-xxxx或xxxxx-xxxx

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

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-09 14:45:31

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

代码语言:javascript
运行
复制
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);

2PATINDEX的原因是因为值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

票数 1
EN

Stack Overflow用户

发布于 2018-04-09 14:05:37

对于单个值,可以使用PATINDEX

代码语言:javascript
运行
复制
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演示

票数 3
EN

Stack Overflow用户

发布于 2018-04-09 14:20:15

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

代码语言:javascript
运行
复制
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]%'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49734837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档