Oracle 값 목록에서 선택하는 방법
이거 말하는 거야stackoverflow
답변:
Oracle에서 이와 유사한 작업을 수행할 수 있는 방법은 무엇입니까?
이 페이지에 있는 다른 답변들은UNION
이 방법은 기술적으로 효과가 있지만, 제 경우에는 사용하고 싶지 않습니다.
따라서 어느 정도 쉼표로 구분된 값 목록처럼 보이는 구문을 계속 사용하고 싶습니다.
답변에 대한 업데이트:
테이블이 있습니다.
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
;
저장된 유형을 생성할 필요가 없으며 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));
쉼표로 구분된 값의 문자열을 변환하려면 Justin Cave의 정규 표현 SQL 솔루션을 권장합니다.
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
쉼표로 구분된 목록을 여러 데이터 행으로 구문 분석하는 방법은 여러 가지가 있습니다.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', ',', '","')||'"'));
[비권장] - op용으로 추가합니다만, 두 번째 코드는 "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 버전과 첫 번째 절차에 사용된 동일한 코드를 보내주시면 감사하겠습니다.행운을 빌어요.
언급URL : https://stackoverflow.com/questions/10353969/how-can-i-select-from-list-of-values-in-oracle
'programing' 카테고리의 다른 글
HTTP 요청에 Axios와 jQuery를 사용할 때의 차이점은 무엇입니까? (0) | 2023.03.17 |
---|---|
표 형식의 데이터를 JSON으로 어떻게 표현해야 합니까? (0) | 2023.03.17 |
JSON.stringify가 삭제하지 않은 미정의 보존 (0) | 2023.03.17 |
Typescript를 사용하여 Express Request 개체 확장 (0) | 2023.03.17 |
왜 사람들은 리액트/JSX에 { " }을(를) 넣을까요? (0) | 2023.03.17 |