2014-12-09 1 views
0

많은 다른 값에 대해 테이블 ​​열의 매 2 위치를 확인하고 싶습니다. 이것은 내가 무엇을해야 할 알고있는 유일한 방법입니다 (2 개 자리 위치의에 지정된 모든 값을 일치하는 행을 선택),하지만 난 청소기가 내기, 짧은 방법 :여러 substr instr OR 문을 수행하는 더 쉬운 방법 oracle pl sql

select * 
from table 
where 1=1 
and (  
Substr(columnA,1,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,3,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,5,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,7,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,9,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,11,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,12,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,14,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 
         or Substr(columnA,16,2) IN ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM')) 
; 

참고 : 열의 값이 ABCDEF이고 'BC'가 있는지 확인하는 경우 일치 항목이 없어야하며 'AB', 'CD', 'EF'만 일치해야합니다.

나는 단 한 번만 찾고있는 모든 것을 나열 할 수 있기를 원합니다. 한 번만 columnA를 나열하는 것이 더 좋을 것입니다. 유용 할 수있는 INSTR 함수를 찾았지만 여기에 적용하는 방법을 모르겠습니다. (1,3,5,7,9,11,14,16)

IN 측량기 (COLUMNA, 'XX')를 그러나 모든이 작업을 수행하는 것보다 더 좋은 방법이있다 :

이 작동 가치 나는 찾고 있습니까? 어떻게 COALESCE를 사용할 수 있습니까?

답변

3

REGEXP_LIKE을 사용하여 regular expression과 일치합니까? 뭐 그런 :

  • ^

    '^(..)*((CE)|(44)|(45)|(87)|(89)|(UT)|(AZ)|(XX)|(YY)|(S1)|(S2)|(S3)|(S4)|(ES)|(PM))' 
    
    는 정규식을 보장하기는
  • (..)* 먹는다 0 문자 귀하의 이중 음자의
  • ((CE)|...) 일치 하나의 많은 라인의 시작에 고정된다.

실례로는 http://sqlfiddle.com/#!4/d41d8/38453/0을 참조하십시오.

+0

계속 구문 오류가 발생합니다. 이 항목을 내 선택에 넣을 수 있습니까? 및 REGEXP (columnA, '^ (..) * (CE) | (44) | (45) | (87) | (89) | (AZ)) | (XX) | (YY) | (S1) | (S2) | (S3) | (S4) | (ES) | (PM) ') ? – user1344919

+1

및 regexp_like (.....) – Joe

+0

@ user1344919이 예제를 참조하십시오 : http://sqlfiddle.com/#!4/d41d8/38453 –

0

이 답변은 2자를 모두 검색한다고 가정합니다. 짝수 번호가 잘못되었다고 가정하고 있습니다. 기술적으로는 원래 질문에서 겹치는 문자열을 검색하고 있습니다.

정규 패턴이므로 생성 할 수 있으므로 쿼리를 단순화 할 수 있습니다. 이 경우

WITH search_pattern AS 
     (SELECT  LEVEL * 2 - 1 search_start 
     FROM  DUAL 
     CONNECT BY LEVEL <= 9) 
SELECT DISTINCT t.* 
FROM table1 t CROSS JOIN search_pattern sp 
WHERE SUBSTR (t.columna, search_start, 2) IN 
      ('CE','44','45','87','89','UT','AZ','XX','YY','S1','S2','S3','S4','ES','PM') 

, 우리 or 동등한 기능을 각각의 위치에 대해 하나 개의 행을 갖는다. distinct 키워드는 두 번 이상 유효성을 검사하는 행이 두 번 이상 반환되지 않도록하는 데 필요합니다.


이 솔루션은 기능적이지만, @ SylvainLeroux의 대답은 정규 표현식을 사용하면 더 잘 수행 될 것입니다.

+0

이것이 작동하는 것처럼 보입니다.이 CTE를 columnA에 코드가있는 고유 이름 만 선택하는 기본 쿼리와 어떻게 조합합니까? – user1344919

+0

't. * '대신에 반환하고자하는 열의 목록을 사용하십시오. CTE는 테이블처럼 작동합니다. SELECT 절에 열을 지정하지 않으면 반환되지 않습니다. – Allan

+0

필자도이 방법을 사용할 수 있지만 여러 가지 쿼리를 입력하고 복사하고 지나치게 힘들어합니다. 나는이 대답들 중 하나에 대한 충분한 명성이 없습니다. – user1344919