在oracle查询中复制行

在oracle查询中复制行,oracle,Oracle,我将创建一个查询,该查询将用于在我们的项目中打印标签,并且发现它很难,因为标签数量的计数是基于字符串的。我提出了如下查询: SELECT wipdatavalue , containername , l , q as qtybox , d , qtyperbox AS q , productname , dt , dsn , CASE WHEN instr(wipdatavalue, '-') = 0 THEN

我将创建一个查询,该查询将用于在我们的项目中打印标签,并且发现它很难,因为标签数量的计数是基于字符串的。我提出了如下查询:

SELECT 
  wipdatavalue
  , containername
  , l
  , q as qtybox
  , d
  , qtyperbox AS q
  , productname
  , dt
  , dsn
  , CASE
      WHEN instr(wipdatavalue, '-') = 0
        THEN
          to_number(wipdatavalue)
      ELSE
          to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
    END AS una
  , CASE
      WHEN instr(wipdatavalue, '-') = 0 
        THEN
          to_number(wipdatavalue)
      ELSE
        to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
    END AS dulo  
  , ROW_NUMBER() OVER (ORDER BY containername) AS n
  , count(*) over() m
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
GROUP BY wipdatavalue, containername, l, q, d, qtyperbox, productname, dt, dsn
ORDER BY wipdatavalue
上述查询将导致以下结果:

但实际上,我必须显示第一个项目Wipdatavalue 1-4,不仅显示一次,而且显示四次,以显示如下内容:

SELECT 
  wipdatavalue
  , containername
  , l
  , q as qtybox
  , d
  , qtyperbox AS q
  , productname
  , dt
  , dsn
  , CASE
      WHEN instr(wipdatavalue, '-') = 0
        THEN
          to_number(wipdatavalue)
      ELSE
          to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
    END AS una
  , CASE
      WHEN instr(wipdatavalue, '-') = 0 
        THEN
          to_number(wipdatavalue)
      ELSE
        to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
    END AS dulo  
  , ROW_NUMBER() OVER (ORDER BY containername) AS n
  , count(*) over() m
FROM trprinting_ls
WHERE containername = 'TRALTESTU0A'
GROUP BY wipdatavalue, containername, l, q, d, qtyperbox, productname, dt, dsn
ORDER BY wipdatavalue
我尝试了另一个运行良好的查询,但当我尝试在项目中加载它时,它不会打印标签。我们发现这是因为WITH声明,我们不知道为什么。查询是:

WITH DATA (WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n)
     AS (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo,(dulo - una) + 1 AS m1,una n
           FROM (SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYPERBOX AS QTYBOX, PRODUCTNAME, DT,
                        CASE
                          WHEN instr(wipdatavalue, '-') = 0
                          THEN
                            to_number(wipdatavalue)
                          ELSE
                            to_number(substr(wipdatavalue, 1, instr(wipdatavalue, '-') - 1))
                          END AS una,
                          CASE
                            WHEN instr(wipdatavalue, '-') = 0 
                            THEN
                              to_number(wipdatavalue)
                            ELSE
                              to_number(substr(wipdatavalue, instr(wipdatavalue, '-') + 1))
                          END AS dulo
                   FROM trprinting_ls
                  WHERE containername = 'TRALTESTU0A'
                  )
         UNION ALL
         SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, m1, n + 1
           FROM DATA
          WHERE n + 1 <= dulo)
SELECT WIPDATAVALUE, CONTAINERNAME, L, Q, D, QTYBOX, PRODUCTNAME, DT, una, dulo, n,
       count(*) OVER () m
FROM DATA
ORDER BY n, wipdatavalue
谢谢大家的帮助。

试试这个查询

试试这个

select * 
from your_data
start with instr(Wipdatavalue, '1') > 0
connect by level between regexp_substr(Wipdatavalue, '^\d+') 
and regexp_substr(Wipdatavalue, '\d+$')
这是一个简化的例子

regexp_substr可以替换为substr,如果您愿意,instr也可以更快


如果可能,请共享表结构和一些示例数据……您好,Vinet,我没有访问表结构的权限。至于样本数据,我在上面的图片上有。如果您还需要其他东西,请告诉我。为什么在第一个查询中需要group by?recurcieve CTEs第二个查询仅在oracle 11gR2中使用。Hi A.B.Cade,我使用group by表达式,因为我计算所有返回行的总数,即m。我不确定我们是否使用11gR2。如果不使用WITH语句,还有其他方法可以做到这一点吗?因为您使用的是count*over,您不需要group by,over使其成为一个窗口函数,请尝试删除group by,看看它是否适用于您您好a.B.凯德,这个方法很好,除了以下安排:我想知道如何解决此问题。@GianIsTheName,你说的“安排”是指订单吗?如果是,请尝试按regexp_substrWipdatavalue“^\d+”添加订单