【问题标题】:Query for selecting particular string from a larger string in plsql从 plsql 中的较大字符串中选择特定字符串的查询
【发布时间】:2015-08-24 17:44:23
【问题描述】:

我的列值如下 'INDIA#PRODUCT1#,CANADA#PRODUCT1#,USA#PRODUCT3,CANADA#PRODUCT1#,EMEA#PRODUCT2,USA#PRODUCT4#,ITALY#PRODUCT2#,EMEA#PRODUCT2#'

现在想要在 oracle 10g 中进行选择查询,它将输出作为 Product1 和 product2 两列,如下所示

PRODUCT1                                 

印度、加拿大、加拿大

PRODUCT2

欧洲、意大利、欧洲、中东和非洲

所有以 product1 作为一列的区域和以 product2 作为另一列作为逗号分隔值的区域。 注意:不应使用枢轴概念,因为它是 10g,并且不应创建任何可在 select 子句中使用的函数来实现此输出。这个需要实现的是select查询本身,请帮忙

谢谢

【问题讨论】:

  • 哇,如果你不得不做这样的事情,糟糕的数据库设计。将正则表达式视为一种可能的选择。为什么反对编写函数?
  • 在 L2 级别支持的银行域中工作,因此无权创建函数。此要求适用于生成报告。

标签: oracle plsql oracle10g


【解决方案1】:

这是在 2 列 PRODUCT - CONUTRIES 中检索此类数据的一些令人讨厌的示例:

WITH items AS
(SELECT TRIM('#' FROM TRIM(SUBSTR(MYTEXT, INSTR (MYTEXT, ',', 1, level) + 1, INSTR (MYTEXT, ',', 1, level+1) - INSTR (MYTEXT, ',', 1, level) -1 ))) AS item
  FROM
    ( SELECT ',' || 'INDIA#PRODUCT1#,CANADA#PRODUCT1#,USA#PRODUCT3,CANADA#PRODUCT1#,EMEA#PRODUCT2,USA#PRODUCT4#,ITALY#PRODUCT2#,EMEA#PRODUCT2' ||',' AS MYTEXT FROM dual
    )
    CONNECT BY level <= LENGTH(MYTEXT)-LENGTH(REPLACE(MYTEXT,',',''))-1
)
,products AS
(
  SELECT
    'PRODUCT'||LEVEL AS product
    ,'\w+#PRODUCT'||LEVEL AS product_regex
  FROM
    dual
  CONNECT BY LEVEL < 5
)
SELECT
  p.product
  ,TRIM(BOTH ',' FROM
    XMLAGG(XMLELEMENT(e, REGEXP_SUBSTR(i.item,'^[^#]+')||',') ORDER BY REGEXP_SUBSTR(i.item,'^[^#]+')).EXTRACT('//text()')
  ) AS countries
FROM
  items i
  ,products p
WHERE
  REGEXP_LIKE(i.item,p.product_regex)
GROUP BY
  p.product;

这给出了以下结果:

PRODUCT    |    COUNTRY
-----------------------------------
PRODUCT1   |  CANADA,CANADA,INDIA
PRODUCT2   |  EMEA,EMEA,ITALY
PRODUCT3   |  USA
PRODUCT4   |  USA

稍后将尝试整理一些更接近您的解决方案的内容。 希望这个小sn-p对你有所帮助。

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多