2016-08-26 3 views
-2

테이블에 PRODUCTCODE_, ACCOUNTNUMBER_TYPE _이있는 테이블이 있습니다.ORACLE에서 AND OR 사용 AND

나는 PRODUCTCODE_에 대한 값으로

  • PCBB02와 기록을 가지고있다. 내가 처음을 삭제하고 쿼리 할 때

    SELECT * 
    FROM MyTable 
    WHERE 1=1 
        AND (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ <> 'PABB01' AND PRODUCTCODE_ <> 'PABB05') 
        OR (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ = 'PCBB02' AND ACCOUNTNUMBER_ = '98') 
    

    이 라인은 다음과 같습니다 ACCOUNTNUMBER_

내가 벨으로 질의를 한 가치로 TYPE_

  • 98에 대한 값으로
  • 는 DepositAccount (내가 원하는 것은) 표시되지 않지만 라인 아래의 쿼리는 결과에 포함됩니다.

    그래서 문제는 쿼리에서 AND/OR 사용의 혼란입니다. 올바른 쿼리는 무엇입니까?

    EXMP :

    PRODUCTCODE_ TYPE_  ACCOUNTNUMBER_ 
    PCBB02  DepositAccount  90 
    PCXXX   DepositAccount  00 
    

    예상 결과 : 행 2

    현재 결과 : 행 1 행 2

  • +0

    샘플 데이터 및 예상 출력을 표시하십시오. 너 뭐하려고?왜냐하면 당신이 말하지 않기 때문에 우리는 무엇이 잘못되었는지를 짐작할 수 없기 때문입니다. 당신이 적용하려고하는 논리를 설명해야합니다. [** XY 문제는 무엇입니까? **] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) [** 어떻게 -to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t 그리고 [** 시작 **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-a-public-forum /) 질문 품질을 향상시키고 더 나은 답변을 얻는 방법을 알아보십시오 –

    +0

    질문 편집 –

    +0

    원하는 논리를 설명 할 수 있습니까? ? 첫 번째 조건은 두 코드 모두'<> ('PABB01', 'PABB05')'btw이므로 참이어야합니다. 두 조건이 모두 사용하기 때문에 단일 TYPE_ = 'DepositAccount'를 넣을 수 있습니다. –

    답변

    0

    자리 표시 자 "1 = 1"

    SELECT * FROM MyTable 
    WHERE (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ <> 'PABB01' AND PRODUCTCODE_ <> 'PABB05') 
    OR (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ = 'PCBB02' AND ACCOUNTNUMBER_ = '98') 
    
    +0

    여전히 동일한 문제 –

    +0

    PRODUCTCODE_가 'PABB01'이 아니고 PRODUCTCODE_도 'PABB05'가 아니기 때문에 행 1과 행 2가 모두 나타납니다. – BWS

    0
    을 복용하십시오

    문제 번호 1은 귀하의 1 = 1이므로 속하지 않으므로 처음에 삭제하면 1 = 1이됩니다 (TYPE _.... .) 그것은 옳지 않다. AND를 제거하려면 제거하십시오. 당신이 실제로 원하는 결과가 무엇인지에 관해서는 당신이 원하는 결과를 더 명확하게 지정해야합니다. 그래서 당신이 더 잘 당신을 도울 수 있습니다.

    SELECT * FROM MyTable WHERE 
    (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ <> 'PABB01' AND PRODUCTCODE_ <> 'PABB05') 
    OR (TYPE_ = 'DepositAccount' AND PRODUCTCODE_ = 'PCBB02' AND ACCOUNTNUMBER_ = '98') 
    

    다음 당신은 acutally 당신이 동일한은 읽기가 좀 더 쉽게 만들 것입니다 원하는하지 않는 것이 아니라 한 번에 다수의 제품 코드를 나열 NOT IN을 사용할 수 있습니다. 그리고 DepositAccount Type은 둘 다에 있기 때문에 자체 조건 일 수 있습니다. 'PCBB02는'01 & 05 당신 아니거나 문은 중복 및 필요는 없습니다 또한 때문 :

    SELECT * FROM MyTable WHERE 
    TYPE_ = 'DepositAccount' 
    AND PRODUCTCODE_ NOT IN ('PABB01','PABB05') 
    

    그리고 당신은 정말 그냥 그런 당신이 할 수있는 02 (98)로 기록하려면 다음과 같이

    SELECT * FROM MyTable WHERE 
    TYPE_ = 'DepositAccount' AND PRODUCTCODE_ = 'PCBB02' AND ACCOUNTNUMBER_ = '98' 
    

    귀하의 의견에 여기에 여러 가지 방법이 있습니다. 이해하기 쉽습니다. 조건 앞에 NOT을 사용하면 결과 집합에서 참일 때 제외됩니다. 계좌 번호는 '98'

    SELECT * FROM MyTable WHERE 
    TYPE_ = 'DepositAccount' 
    AND PRODUCTCODE_ NOT IN ('PABB01','PABB05') 
    AND NOT (PRODUCTCODE_ = 'PABB02' AND ACCOUNTNUMBER_ = '98') 
    

    가 ACCOUNTNUMBER_ 정말 숫자 데이터 형식이 아닌 경우 PRODUCTCODE_ = 'PABB02'는 여전히 반환됩니다 참고? 그렇다면 숫자를 둘러싼 작은 따옴표를 제거해야합니다.

    +0

    내 테이블에 1M 이상의 레코드가 있고 네 모든 레코드가 필요합니다. 정황. –

    +0

    @ Blood-HaZaRd 어떤 조건입니까? 귀하의 2 문장은 서로의 돈을주고 있습니다. 당신은 DepositAccount 인 PABB01/05가 아닌 모든 것을 원합니다. 내 두 번째 예제입니다 02 02 예금 계정 인 경우 PCBB02 inlcude 것입니다. 계좌 번호가 98 인 경우에만 02를 포함 하시겠습니까? 실제 비즈니스 요구 사항을 명확하게 밝히지 않았으므로 질문을 편집하는 데 약간의 시간을 투자하십시오. – Matt

    +0

    기록원은 해당 제품 코드가 'PABB01'및 'PABB05'와 다르며 제품 코드 = 'PCBB02'의 경우 계정 번호를 확인해야합니다 98가 아닌 –