2017-12-19 1 views
0

아래 SQL은 개념적으로 해결하려고하는 문제를 복제합니다. NOT IN 절을 전달 함에도 불구하고 세 개의 레코드가 모두 반환됩니다.NOT IN 절에서 구분 된 문자열 전달

SELECT * FROM (
SELECT 'JACK' AS VALUE FROM DUAL 
UNION 
SELECT 'JOHN' AS VALUE FROM DUAL 
UNION 
SELECT 'BOB' AS VALUE FROM DUAL 
) WHERE VALUE NOT IN (SELECT 'BOB,JOHN' FROM DUAL); 

데이터 세트에서 레코드를 제외하는 기준으로 사용하려는 구분 된 문자열을 포함하는 테이블이 있습니다. 그러나, 내가 가진 문제는 반환 된 문자열을 구분 된 항목으로 나눌 수 없습니다. 당신은 그 문제에 대한 REGEXP_SUBSTR을 사용할 수 있습니다

SELECT * FROM (
SELECT 'JACK' AS VALUE FROM DUAL 
UNION 
SELECT 'JOHN' AS VALUE FROM DUAL 
UNION 
SELECT 'BOB' AS VALUE FROM DUAL 
) WHERE VALUE NOT IN ('BOB','JOHN'); 
+0

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:210612357425 – OldProgrammer

+0

구분 된 문자열을 포함하는 테이블이 있습니까? 왜? 데이터베이스를 올바르게 사용하고 문자열을 별도로 저장 한 경우 쿼리를 작성하는 데 아무런 문제가 없습니다. –

+1

''BOB, JOHN ''이 ** 단일 문자열 값 **이므로 3 개의 레코드가 모두 반환됩니다. 분명히 'BOB, JOHN'! = 'BOB' '그리고'BOB, JOHN '! ='JACK '그리고'BOB, JOHN '! ='JOHN '! 결과가 정확합니다. 배열 또는 테이블과 같이 더 적합한 문자열이 아닌 문자열로 컬렉션을 저장하는 것이 문제입니다. – APC

답변

0

: 나는 위의 번역 할

SELECT * FROM (
SELECT 'JACK' AS VALUE FROM DUAL 
UNION 
SELECT 'JOHN' AS VALUE FROM DUAL 
UNION 
SELECT 'BOB' AS VALUE FROM DUAL 
) 
WHERE VALUE NOT IN (SELECT regexp_substr('BOB,JOHN','[^,]+', 1, LEVEL) FROM dual CONNECT BY regexp_substr('BOB,JOHN', '[^,]+', 1, LEVEL) IS NOT NULL) 
+0

코드 블록을 게시하고 "이것을 사용하십시오"라고 말하면 OP 코드의 문제점에 대한 설명과 문제 해결 코드의 이유에 대한 설명 없이는 도움이되지 않습니다. – MT0

+0

시작과 끝은 어디입니까? 그는 substr이 무엇인지 알고 있습니까? 그는 정규식이 무엇인지 어떻게 사용되는지를 알고 있습니까? 그는 무엇에 의해 연결되는지 안다? 그가 더 이상의 질문이 있으면 그는 그들에게 물을 수 있으며 도와 주겠다. 그러나 나는 그가 필요한 더 많은 정보를 짐작하기가 어려울 것입니다. – aLpenbog

1

'BOB,JOHN' 두 문자열의 목록이 아닌 그냥를 포함 할 일이 하나 개의 문자열 값입니다 값 문자열에 쉼표와 :

'JACK' = 'BOB,JOHN' 
'JOHN' = 'BOB,JOHN' 
'BOB' = 'BOB,JOHN' 

NOT IN 필터에 의해 일치하는 모든 거짓 그래서 당신의 쿼리가 반환됩니다 모든 행입니다.

당신은 구분 문자로 값 목록을 둘러싸고 값이이 같은 목록의 하위 문자열이 있는지 여부를 테스트 할 수 있습니다 : 사용자 정의 모음을 사용할 수 있습니다

SELECT * 
FROM (
    SELECT 'JACK' AS VALUE FROM DUAL UNION ALL 
    SELECT 'JOHN' AS VALUE FROM DUAL UNION ALL 
    SELECT 'BOB' AS VALUE FROM DUAL 
) 
WHERE INSTR(',' || 'BOB,JOHN' || ',', ',' || value || ',') = 0 

또는 :

SELECT * 
FROM (
    SELECT 'JACK' AS VALUE FROM DUAL UNION ALL 
    SELECT 'JOHN' AS VALUE FROM DUAL UNION ALL 
    SELECT 'BOB' AS VALUE FROM DUAL 
) 
WHERE VALUE NOT MEMBER OF StringList('BOB', 'JOHN'); 
:
CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(20); 

이어서 값 집합의 멤버인지 여부를 테스트 할 MEMBER OF 연산자를 사용

관련 문제