在Oracle 9i中分割逗号分隔的值

4
在Oracle中,我有名为orderids的列。
orderids
111,222,333
444,55,66
77,77

如何获得以下输出
Orderid
111
222
333
444
55
66
77
77

将来请花更多时间格式化您的问题。由于您没有格式化预期和实际输出,所有数字都在同一行上,这个问题相当具有误导性。我已经修复了它。 - Codo
如果你在谷歌上搜索“oracle将字符串拆分为行”,你会找到你需要的内容,例如https://dev59.com/UGYq5IYBdhLWcg3woCC7。 - Codo
不对,@Codo,正则表达式是在10g中引入的,这意味着通常的做法行不通(这也是我没有关闭的原因)。 - Ben
好观点。但也可以使用INSTR和SUBSTR来完成。 - Codo
是的,还有DBMS_UTILITY.COMMA_TO_TABLE - Ben
Oracle 9i已经不再得到支持接近十年了。您应该考虑升级到受支持的版本(即11.x或12.x)。 - user330315
4个回答

4

试试这个:

 WITH TT AS
 (SELECT orderid COL1 FROM orders)
 SELECT substr(str,
                   instr(str, ',', 1, LEVEL) + 1,
                   instr(str, ',', 1, LEVEL + 1) -
                   instr(str, ',', 1, LEVEL) - 1) COL1
     FROM   (SELECT rownum AS r,
                    ','|| COL1||',' AS STR
               FROM   TT )
     CONNECT BY PRIOR r = r
         AND    instr(str, ',', 1, LEVEL + 1) > 0
         AND    PRIOR dbms_random.STRING('p', 10) IS NOT NULL
;

enter image description here

See this SQLFiddle


我想要每个单词都在独立的行中。 - Naveen Kumar

1
这是一种方法:
with order_table as (
  select '111,222,333' as orderids from dual
  union all select '444,55,66' from dual
  union all select '77,77' from dual
)
select substr(orderids, instr(orderids, ',', 1, lvl) + 1, instr(orderids, ',', 1, lvl + 1) - instr(orderids, ',', 1, lvl) - 1) orderid 
from
  ( select ',' || orderids || ',' as orderids from order_table ),
  ( select level as lvl from dual connect by level <= 100 )
where lvl <= length(orderids) - length(replace(orderids, ',')) - 1;

只需删除 WITH 子句并将 order_table 替换为您的实际表即可。


0
instr(','||NVL('972414AQ,972414AQ',I.CUSIP)||',', ','||I.CUSIP||',') > 0

这就是我要找的实际查询。


0

这也许对你有帮助,

with t(orderid) as 
(
SELECT '111,222,333' FROM dual
UNION
SELECT '444,55,66' FROM dual
UNION
SELECT '177,77' FROM dual
)
SELECT trim(x.COLUMN_VALUE.EXTRACT('e/text()')) cols 
FROM t t, TABLE (xmlsequence(XMLTYPE('<e><e>' || REPLACE(t.orderid,',','</e><e>')|| '</e></e>').EXTRACT('e/e'))) x;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接