Ответ 1
Вам не нужно создавать какие-либо хранимые типы, вы можете оценить типы встроенных коллекций Oracle.
select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5))
Я имею в виду этот ответ stackoverflow
:
Как выбрать из списка значений в SQL Server
Как можно сделать что-то подобное в Oracle?
Я видел другие ответы на этой странице, которые используют UNION
, и хотя этот метод технически работает, это не то, что я хотел бы использовать в моем случае.
Поэтому я хотел бы остаться с синтаксисом, который более или менее выглядит как список значений, разделенных запятыми.
ОБНОВЛЕНИЕ относительно ответа create type table
:
У меня есть таблица:
CREATE TABLE "BOOK"
( "BOOK_ID" NUMBER(38,0)
)
Я использую этот script, но он не вставляет строки в таблицу 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
;
Script вывод:
TYPE number_tab compiled
Warning: execution completed with warning
Но если я использую этот script, он вставляет новые строки в таблицу 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
;
Вам не нужно создавать какие-либо хранимые типы, вы можете оценить типы встроенных коллекций Oracle.
select distinct column_value from table(sys.odcinumberlist(1,1,2,3,3,4,4,5))
Если вы хотите преобразовать список значений с разделителями-запятыми:
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));
Если вы хотите преобразовать строку значений с разделителями-запятыми, я бы рекомендовал решение SQLin регулярного выражения Justin Cave.
Существуют различные способы использования списка, разделенного запятыми, и анализа его на несколько строк данных. В 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.
Вы можете сделать это:
create type number_tab is table of number;
select * from table (number_tab(1,2,3,4,5,6));
В столбце указано имя COLUMN_VALUE от Oracle, поэтому это тоже работает:
select column_value from table (number_tab(1,2,3,4,5,6));
Привет также возможно для строк с XML-таблицей
SELECT trim(COLUMN_VALUE) str FROM xmltable(('"'||REPLACE('a1, b2, a2, c1', ',', '","')||'"'));