【问题标题】:Query to get specific patterns from column查询以从列中获取特定模式
【发布时间】:2015-10-17 16:06:12
【问题描述】:

我的一个表格列包含以下值。

All Files (*.*)|*.*|Bitmap (*.bmp)|*.bmp|Microsoft Word Document
(*.docx)|*.docx|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|PNG
(*.png)|*.png|Adobe Reader (*.pdf)|*.pdf|TIFF (*.tif)|*.tif

我需要一个查询,它将从上述值中获取bmp,docx,gif,jpg,png,pdf,tif。这些值显示在括号中。

【问题讨论】:

  • 需要更多信息。什么版本的甲骨文?您的示例是 3 行,列由管道分隔,还是整行显示在一列中?括号中可以有空值吗?显示预期输出的确切示例。你都尝试了些什么?这可能会为您尝试做什么提供线索。
  • “所有文件 (.)”怎么样?

标签: sql plsql


【解决方案1】:

好的,鉴于这些假设:

  • 您的示例数据为 3 行
  • 整行在一列中
  • 你不想在第一行出现*.*

试试这个:

SQL> with tbl(line_nbr, str) as (
      select 1, 'All Files (*.*)|*.*|Bitmap (*.bmp)|*.bmp|Microsoft Word Document' from dual
      union
      select 2, '(*.docx)|*.docx|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|PNG' from dual
      union
      select 3, '(*.png)|*.png|Adobe Reader (*.pdf)|*.pdf|TIFF (*.tif)|*.tif' from dual
    )
    SELECT line_nbr, str,
           COLUMN_VALUE AS match_nbr,
          REGEXP_SUBSTR( str ,'\(\*\.(\w*)\)', 1, COLUMN_VALUE, NULL, 1 ) AS match_value
   FROM   tbl,
          TABLE(
            CAST(
              MULTISET(
                SELECT LEVEL
                FROM   DUAL
                CONNECT BY LEVEL <= REGEXP_COUNT( str ,'\(\*\.\w*\)' )
              ) AS SYS.ODCINUMBERLIST
            )
          );

  LINE_NBR STR                                                               MATCH_NBR MATCH_VALUE
---------- ---------------------------------------------------------------- ---------- -----------
         1 All Files (*.*)|*.*|Bitmap (*.bmp)|*.bmp|Microsoft Word Document          1 bmp
         2 (*.docx)|*.docx|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|PNG                  1 docx
         2 (*.docx)|*.docx|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|PNG                  2 gif
         2 (*.docx)|*.docx|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|PNG                  3 jpg
         3 (*.png)|*.png|Adobe Reader (*.pdf)|*.pdf|TIFF (*.tif)|*.tif               1 png
         3 (*.png)|*.png|Adobe Reader (*.pdf)|*.pdf|TIFF (*.tif)|*.tif               2 pdf
         3 (*.png)|*.png|Adobe Reader (*.pdf)|*.pdf|TIFF (*.tif)|*.tif               3 tif

7 rows selected.

SQL>

感谢这篇文章中的 MT0 提供了正确处理多行的技巧:Split string by space and character as delimiter in Oracle with regexp_substr

【讨论】:

    【解决方案2】:

    这是你想要的吗?

    SELECT * 
    FROM your_table 
    WHERE column_with_types IN ('(.bmp)','(.docx)','(.gif)','(.jpg)','(.png)','(.pdf)','(.tif)')
    

    【讨论】:

      猜你喜欢
      • 2020-02-20
      • 1970-01-01
      • 2012-07-22
      • 2019-03-27
      • 1970-01-01
      • 2022-01-12
      • 2016-11-07
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多