如何从Oracle中的值列表中进行选择

rap*_*apt 46 sql oracle select oracle11g

我指的是这个stackoverflow答案:

如何从SQL Server中的值列表中进行选择

如何在Oracle中完成类似的工作?

我已经在这个页面上看到了其他使用的答案UNION,虽然这种方法在技术上有效,但它并不是我想在我的情况下使用的.

所以我希望保持语法或多或少看起来像逗号分隔的值列表.

关于create type table 答案的更新:

我有一张桌子:

CREATE TABLE "BOOK" 
(   "BOOK_ID" NUMBER(38,0)
)
Run Code Online (Sandbox Code Playgroud)

我使用此脚本,但它不会向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
;
Run Code Online (Sandbox Code Playgroud)

脚本输出:

TYPE number_tab compiled
Warning: execution completed with warning
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用此脚本,它会向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
;
Run Code Online (Sandbox Code Playgroud)

Kir*_*tev 68

您无需创建任何存储类型,您可以评估Oracle的内置集合类型.

select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5))
Run Code Online (Sandbox Code Playgroud)

  • 这就是让我发现我需要的 SYS.ODCIVARCHAR2LIST 的原因。谢谢! (3认同)
  • @SonicSoul 因为它们实际上都不是像我上面的回答那样用于“随意”使用。ODCI 代表 oracle 数据盒接口,dbms_debug_vc2_coll 旨在与 DBMS_DEBUG 包一起使用。 (2认同)
  • 如果你有一个字符串列表,你可以使用sys.odcivarchar2list('A','B','C') (2认同)

Wol*_*olf 48

如果您要转换以逗号分隔的值列表:

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));
Run Code Online (Sandbox Code Playgroud)

如果你想转换一串逗号分隔值,那么我会推荐Justin Cave的正则表达式SQL解决方案.


Kau*_*yak 7

从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
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 6

你可以这样做:

create type number_tab is table of number;

select * from table (number_tab(1,2,3,4,5,6));
Run Code Online (Sandbox Code Playgroud)

该列由 Oracle 命名为 COLUMN_VALUE,因此这也适用:

select column_value from table (number_tab(1,2,3,4,5,6));
Run Code Online (Sandbox Code Playgroud)


Jus*_*ave 6

有多种方法可以采用逗号分隔列表并将其解析为多行数据.在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.
Run Code Online (Sandbox Code Playgroud)

或者在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.
Run Code Online (Sandbox Code Playgroud)