我指的是这个stackoverflow
答案:
How can I select from list of values in SQL Server
如何在 Oracle 中完成类似的工作?
我在这个页面上看到过使用UNION
的其他答案,尽管这种方法在技术上有效,但在我的情况下并不是我想要使用的。
所以我希望保持语法或多或少看起来像逗号分隔的值列表。
关于create type table
answer 的更新 :
我有一张桌子:
CREATE TABLE "BOOK"
( "BOOK_ID" NUMBER(38,0)
)
我使用此脚本,但它不会向BOOK
表插入任何行:
create type number_tab is table of number;
INSERT INTO BOOK (
BOOK_ID
)
SELECT A.NOTEBOOK_ID FROM
(select column_value AS NOTEBOOK_ID from table (number_tab(1,2,3,4,5,6))) A
;
脚本输出:
TYPE number_tab compiled
Warning: execution completed with warning
但是如果我使用这个脚本,它确实会在BOOK
表中插入新行:
INSERT INTO BOOK (
BOOK_ID
)
SELECT A.NOTEBOOK_ID FROM
(SELECT (LEVEL-1)+1 AS NOTEBOOK_ID FROM DUAL CONNECT BY LEVEL<=6) A
;
答案 0 :(得分:61)
您无需创建任何存储类型,您可以评估Oracle的内置集合类型。
select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5))
答案 1 :(得分:46)
如果您要转换以逗号分隔的值列表:
select column_value
from table(sys.dbms_debug_vc2coll('One', 'Two', 'Three', 'Four'));
-- Or
select column_value
from table(sys.dbms_debug_vc2coll(1,2,3,4));
如果你想转换一串逗号分隔的值,那么我会推荐Justin Cave的正则表达式SQL解决方案。
答案 2 :(得分:5)
有多种方法可以使用以逗号分隔的列表并将其解析为多行数据。在SQL中
SQL> ed
Wrote file afiedt.buf
1 with x as (
2 select '1,2,3,a,b,c,d' str from dual
3 )
4 select regexp_substr(str,'[^,]+',1,level) element
5 from x
6* connect by level <= length(regexp_replace(str,'[^,]+')) + 1
SQL> /
ELEMENT
----------------------------------------------------
1
2
3
a
b
c
d
7 rows selected.
或者在PL / SQL
中SQL> create type str_tbl is table of varchar2(100);
2 /
Type created.
SQL> create or replace function parse_list( p_list in varchar2 )
2 return str_tbl
3 pipelined
4 is
5 begin
6 for x in (select regexp_substr( p_list, '[^,]', 1, level ) element
7 from dual
8 connect by level <= length( regexp_replace( p_list, '[^,]+')) + 1)
9 loop
10 pipe row( x.element );
11 end loop
12 return;
13 end;
14
15 /
Function created.
SQL> select *
2 from table( parse_list( 'a,b,c,1,2,3,d,e,foo' ));
COLUMN_VALUE
--------------------------------------------------------------------------------
a
b
c
1
2
3
d
e
f
9 rows selected.
答案 3 :(得分:4)
你可以这样做:
create type number_tab is table of number;
select * from table (number_tab(1,2,3,4,5,6));
Oracle为该列命名为COLUMN_VALUE,因此也适用:
select column_value from table (number_tab(1,2,3,4,5,6));
答案 4 :(得分:2)
嗨,带有XML-Table的字符串也可能
SELECT trim(COLUMN_VALUE) str FROM xmltable(('"'||REPLACE('a1, b2, a2, c1', ',', '","')||'"'));
答案 5 :(得分:0)
从Oracle 12.2开始,您不需要TABLE
功能,您可以直接从内置集合中进行选择。
SQL> select * FROM sys.odcinumberlist(5,2,6,3,78);
COLUMN_VALUE
------------
5
2
6
3
78
SQL> select * FROM sys.odcivarchar2list('A','B','C','D');
COLUMN_VALUE
------------
A
B
C
D
答案 6 :(得分:0)
[已弃用] - 只是为了添加操作, 你的第二个代码的问题似乎是你没有在那里定义你的“number_tab”类型。
AS:
CREATE type number_tab is table of number;
SELECT a.notebook_id FROM (
SELECT column_value AS notebook_id FROM table (number_tab(1,2,3,4,5,6) ) ) a;
INSERT INTO BOOK ( BOOK_ID )
SELECT a.notebook_id FROM (
SELECT column_value AS notebook_id FROM table (number_tab(1,2,3,4,5,6) ) ) a;
DROP type number_tab ;
抱歉,我无法重现您的错误,您能否将使用的 oracle 版本和用于该过程的相同代码发送给我们,这可能会有所帮助。一切顺利。