2011-11-04 5 views
2

예를 들어 단 하나의 열만있는 간단한 테이블이 있습니다. 예. 다음과 같은 데이터로 설정sql - 존재하지 않는 값을 반환하는 단일 쿼리

CREATE TABLE movies (title VARCHAR2(255 BYTE)) 

:

INSERT INTO movies (title) VALUES ('Scream'); 
INSERT INTO movies (title) VALUES ('Blair Witch'); 
INSERT INTO movies (title) VALUES ('Friday the 13th'); 
INSERT INTO movies (title) VALUES ('Scary Movie'); 
INSERT INTO movies (title) VALUES ('Hide and Seek'); 
INSERT INTO movies (title) VALUES ('Alien vs Predator'); 

할 것입니다 단일 쿼리 또는 PL은/SQL은 거기에 동적으로 다음 (즉, 선택 '비명'수동 'UNION을 할 필요없이 에서 듀얼 ... "모든 가치)?

분명히이 쿼리는 잘못하지만 당신은 아이디어를 얻을 :

Select * from movies 
where title in (
'Scream', 
'Scary Movie', 
'Exorcist', 
'Dracula', 
'Saw', 
'Hide and Seek' 
) 

원하는 결과 레코드가 테이블에 존재하지 않는 절 "IN WHERE TITLE"는 모든 값에 대한 기록 인. 예.

'Exorcist' 
'Dracula' 
'Saw' 
+0

선정 된 행이 모든 방법의 관계 (테이블)에서 온

은 약 조 셀코의 문서를 참조하십시오. 당신은 언젠가 당신이 말한 것과 같은 모든 가치에 대해 "UNION select"이중에서 "비명을 지어서"라는 표를 만들어야합니다. – danihp

답변

3

당신이 10g 이상, 동적 테이블에 CSV 문자열을 변환하는 기능을 구축 스트링 토크 나이에 대한 코드를 확인하실 수 있습니다를 사용하는 경우. . this other response

이처럼 사용합니다 :

select * from movies 
where title NOT in (
     select * 
      from table (string_tokenizer 
         (
          'Scream, Scary Movie,Exorcist,Dracula,Saw,Hide and Seek' 
         ) 

       ) 
    ) 
/
다음

가 추가 infrastru을 필요로하지 않는 약간 간단한 구현 가능한 화상은 :

SQL> select * from table(sys.dbms_debug_vc2coll('Scream', 
'Scary Movie', 
'Exorcist', 
'Dracula', 
'Saw', 
'Hide and Seek' 
)) 
/
    2 3 4 5 6 7 8 
COLUMN_VALUE 
-------------------------------------------------------------------------------- 
Scream 
Scary Movie 
Exorcist 
Dracula 
Saw 
Hide and Seek 

6 rows selected. 

SQL> 

the Table Value Constructor 유사하지만, 그것은 단지 하나의 컬럼 "테이블"작동 않습니다.

+0

'table' 키워드와'sys.dbms_debug_vc2coll' 이름이 제가 찾고있는 키워드였습니다. 'union select '를 여러 번 반복하는 것을 피할 수있게 도와주었습니다. 감사! –

1

테이블 유형과 함수 테이블()을 사용하여 테이블에 목록을 캐스트 할 수 있습니다.

CREATE OR REPLACE TYPE varchar_list_type as table of varchar2(100); 

CREATE OR REPLACE function in_varchar_list (p_string in varchar2) return varchar_list_type 
as 
    l_data    varchar_list_type := varchar_list_type(); 
    l_string   long default p_string || ','; 
    l_n    number; 
begin 

    loop 
     exit when l_string is null; 

     l_data.extend; 
     l_n := instr(l_string, ','); 
     l_data(l_data.count) := substr(l_string, 1, l_n-1); 
     l_string := substr(l_string, l_n+1); 

    end loop; 
    return l_data; 
end; 

은 다음과 같이 사용합니다

select * from TABLE(select cast(in_varchar_list('foo,bar,baz') as varchar_list_type) from dual) 

당신이 바인드 변수 나 일반 변수 대신 하드 코딩 된 문자열 'foo는, 바, 바즈'를 사용할 수 있습니다 당연히.

편집 : 쿼리^_^"의 오타

2

원하는 것은 "표 값 생성자" 기능입니다. 나는 오라클이 그것을지지한다고 생각하지 않는다. 거기에서 촬영 Table Value Constructors in SQL Server 2008 AMD 예 :

SELECT * 
FROM 
    (VALUES 
     (101, 'Bikes'), 
     (102, 'Accessories'), 
     (103, 'Clothes') 
) AS Category(CategoryID, CategoryName); 
+0

부끄러운 오라클이 가지고 있지 않다 – toop

+0

나는 DB2가 가지고 있다고 생각한다. SQL Server는 최신 (2008) 버전에서만 제공됩니다. –

+0

PostgreSQL도 있습니다. –

관련 문제