【问题标题】:Extracting dimensions with REGEX使用 REGEX 提取维度
【发布时间】:2022-01-07 10:52:48
【问题描述】:

我有一个仓库零件表,每一列都有每个零件的描述。描述中包含产品的尺寸,格式始终为:HeightxWidthxDepth。

描述可以是任意数量的字符,因此维度并不总是在字符串的相同位置。

这是表格的样例:

| Part No  | Description               |
| -------- | ------------------------- |
| ABCDEFGH | Cabinet 245 2070x1014x570 |
| AFFDETGL | Shelves 20104 870x300x330 |

在我的查询中,我想选择每个维度,使表格看起来像这样:

| Part No  | Height| Width | Depth |
| -------- | ----- | ----- | ----- |
| ABCDEFGH | 2070  | 1014  | 570   |
| AFFDETGL | 870   | 300   | 330   |

我已经设法使用 REGEX 通过以下查询从列中提取完整维度:

SELECT
PART_NO,
REGEXP_SUBSTR(DESCRIPTION, '(\d+(\.\d+|)\s?x\s?\d+(\.\d+|)(\s?x\s?\d*(\.?\d+|))?)')
FROM Products

但我不确定如何在不使用 INSTR 之类的内容的情况下将其拆分为 3 个单独的列。

谁能告诉我最好的方法是什么?

【问题讨论】:

    标签: sql regex oracle


    【解决方案1】:

    在数字模式周围使用捕获组,然后使用 REGEXP_SUBSTR 的第 6 个参数提取各个捕获组:

    SELECT PART_NO,
           REGEXP_SUBSTR(
             DESCRIPTION,
             '(\d+\.?\d*)\s*x\s*(\d+\.?\d*)\s*x\s*(\d*\.?\d*)',
             1,
             1,
             NULL,
             1
           ) AS height,
           REGEXP_SUBSTR(
             DESCRIPTION,
             '(\d+\.?\d*)\s*x\s*(\d+\.?\d*)\s*x\s*(\d*\.?\d*)',
             1,
             1,
             NULL,
             2
           ) AS width,
           REGEXP_SUBSTR(
             DESCRIPTION,
             '(\d+\.?\d*)\s*x\s*(\d+\.?\d*)\s*x\s*(\d*\.?\d*)',
             1,
             1,
             NULL,
             3
           ) AS depth
    FROM   Products
    

    其中,对于样本数据:

    CREATE TABLE products (Part_No, Description) AS
    SELECT 'ABCDEFGH', 'Cabinet 245 2070x1014x570' FROM DUAL UNION ALL
    SELECT 'AFFDETGL', 'Shelves 20104 870x300x330' FROM DUAL;
    

    输出:

    PART_NO HEIGHT WIDTH DEPTH
    ABCDEFGH 2070 1014 570
    AFFDETGL 870 300 330

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-02
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多