首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PostgreSQL中提取后跟特定字符串的数字?

如何在PostgreSQL中提取后跟特定字符串的数字?
EN

Stack Overflow用户
提问于 2018-07-26 07:14:18
回答 1查看 233关注 0票数 2

我有下表:

代码语言:javascript
复制
CREATE TABLE test_regex (
    drug TEXT
);

INSERT INTO test_regex
VALUES
    ('DRUGA 200 MG'),
    ('DRUGB 150 MCG'),
    ('DRUGC 1.5 GM BOX'),
    ('DRUGD 27.2 MG/5 ML VIAL')
;

我想提取以下内容:

代码语言:javascript
复制
200 MG
150 MCG
1.5 GM
27.2 MG

到目前为止,我尝试了以下几点:

代码语言:javascript
复制
SELECT
    substring(drug, '[0-9]*\.?[0-9]* MG|GM|MCG')
FROM
    test_regex
;

这会导致:

代码语言:javascript
复制
 200 MG
 MCG
 GM
 27.2 MG

我也尝试过:

代码语言:javascript
复制
SELECT
    substring(drug, '[0-9]*\.?[0-9]* (MG|GM|MCG)')
FROM
    test_regex
;

结果如下:

代码语言:javascript
复制
 MG
 MCG
 GM
 MG

我认为问题在于如何处理尾随的(MG|GM|MCG)组,但我在PostgreSQL文档中找不到我想要的东西。我希望得到第一个数字部分,然后是一个空格,然后是MG、GM或MCG。我认为它被归类为带有MG的数字表达式,然后是GM或MCG。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 07:24:15

主要思想是,您需要将应在字符串中的同一位置匹配的备选方案分组。另外,我建议使用单词边界将字符串作为整个单词进行匹配。

另请注意,如果存在以下匹配,则substring仅返回捕获组捕获的那部分匹配:

如果模式包含任何括号,则返回与第一个带括号的子表达式匹配的文本部分(左括号在前的子表达式)。

因此,您可以使用的分组构造是一个non-capturing group(?:...|...)

您可以使用

代码语言:javascript
复制
substring(drug, '\m[0-9]*\.?[0-9]+\s*(?:MG|GM|MCG)\M')

请参阅online demo

Pattern details

  • \m - word
  • [0-9]*的开始-零个或更多的digits
  • \.? -一个可选的.
  • [0-9]+ -word
  • [0-9]* whitespaces
  • (?:MG|GM|MCG) - efficient)
  • \M - 1+ digits
  • \s* - MG,或者GMMCG (您可以将其编写为(?:MC?G|GM),使其更具efficient)
  • \M-1+ of 0+。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51528906

复制
相关文章

相似问题

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