regexp_substr 提取字符串中的度量单位

Posted

技术标签:

【中文标题】regexp_substr 提取字符串中的度量单位【英文标题】:regex_substr to extract unit of measure within a string 【发布时间】:2020-04-01 15:37:34 【问题描述】:

我是 regexp 的新手,并试图在一个字符串块中提取度量单位。字符串示例如下:

PRODUCT NAME 3.5G 3.5g PRODUCT NAME PRODUCT NAME 3.5 GRAMS PRODUCT NAME 3500MG

如何使用 redshift 中的 regex_substr 函数从上述字符串中提取 3.5G。目前使用案例风格

when regexp_substr(trim(upper(productname)), '3.5G') = '3.5G' then '3.5G'

when regexp_substr(trim(upper(productname)), ' .5G') = ' .5G' then '.5G'

when regexp_substr(trim(upper(productname)), ' 1/8TH') = ' 1/8TH' then '3.5G'
when regexp_substr(trim(upper(productname)), ' 1/4') = ' 1/4' then '7G'
when regexp_substr(trim(upper(productname)), ' 1G') = ' 1G' then '1G'
when regexp_substr(trim(upper(productname)), ' 2G') = ' 2G' then '1G'
when regexp_substr(trim(upper(productname)), ' 1.75G') = ' 1.75G' then '1.75G'
when regexp_substr(trim(upper(productname)), ' 7G') = ' 7G' then '7G'

when regexp_substr(trim(upper(productname)), ' 1/2 ') = ' 1/2 ' and producttype = 'FLOWER' then '14G'
when regexp_substr(trim(upper(productname)), ' 14G') = ' 14G' then '14G'

when regexp_substr(trim(upper(productname)), ' 3.5 GRAM') = ' 3.5 GRAM' then '3.5G'
when regexp_substr(trim(upper(productname)), ' EIGHTH') = ' EIGHTH' then '3.5G'
when regexp_substr(trim(upper(productname)), ' 1 GRAM') = ' 1 GRAM' then '1G'
when regexp_substr(trim(upper(productname)), ' 1.75 GRAM') = ' 1.75 GRAM' then '1.75G'
when regexp_substr(trim(upper(productname)), ' 7 GRAM') = ' 7 GRAM' then '7G'
when regexp_substr(trim(upper(productname)), '14 GRAM') = '14 GRAM' then '14G'

when regexp_substr(trim(upper(productname)), ' 5 MILLIGRAM') = ' 5 MILLIGRAM' then '5MG'
when regexp_substr(trim(upper(productname)), ' 5MG') = ' 5MG' then '5MG'
when regexp_substr(trim(upper(productname)), ' 10MG') = ' 10MG' then '10MG'
when regexp_substr(trim(upper(productname)), ' 25MG') = ' 25MG' then '25MG'

【问题讨论】:

你从'PRODUCT NAME 14 GRAM'中提取了什么? Redshift 还是 Postgres?虽然它们有一些古老的根源,但它们是非常不同的数据库产品 现在使用红移。 14GRAM 是一个不好的例子,但还有其他 uom 类型,如 ML、MG 【参考方案1】:

一种方法是regexp_replace():

with t as (
      select 'PRODUCT NAME 3.5G' as str union all
      select '3.5g PRODUCT NAME' as str union all
      select 'PRODUCT NAME 3.5 GRAMS' as str union all
      select 'PRODUCT NAME 14 GRAM'
      )
select t.*, regexp_replace(' ' || str, '^.*[^.0-9]([\.0-9]+) ?[gG].*$', '\1')
from t;

你也可以使用:

regexp_replace(str, '(^.*[^.0-9]|^)([\.0-9]+) ?[gG].*$', '\2')

【讨论】:

感谢您的快速回答,使用上面的 rexexp_replace 会导致:imgur.com/a/pYCoPgI 另外,如果有其他度量单位,例如(ml、mg 等),我将如何向正则表达式添加更多变体模式? @user1615573 。 . .这回答了你在这里的问题。如果您有新问题,应将其作为问题提出,并附上适当的样本数据、期望的结果和解释。

以上是关于regexp_substr 提取字符串中的度量单位的主要内容,如果未能解决你的问题,请参考以下文章

REGEXP_SUBSTR 红移

当字符串包含 ( 和 ) 时,使用 regexp_substr 提取字符串的一部分

Teradata SQL从中文数字字母混合字符串中只提取数字regexp_substr

在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题

Oracle 使用带有 oracle regexp_substr 的正则表达式提取 json 字段

来自 CLOB 的 Oracle REGEXP_SUBSTR