문제

나는가를 생산하는 임시 보고서의 거래를 만들어진 다른 신용 카드 종류.의 목적을 위해 보고서 그것 괜찮다고 추정하는 모든 신용 카드로 시작하는 4 비자는 카드는 사람들로 시작하는 5 있습니다.

이 쿼리를 잘 작동에 대한 위로 구분합니다.

select card_type = 
    case substring(pan,1,1) 
        when '4' then 'VISA'
        when '5' then 'MasterCard'
        else 'unknown' 
    end,count(*),
    sum(amount)
from transactions
group by card_type

그러나 우리의 상황에서(는 방법을 확실하지 않은 이 작품 세계를 넓)모든 카드로 시작하는 3 려될 수 있 다이너스 카드를 제외하고는 사람들을 위해 시작으로 37 는 AMEX 카드입니다.

확장을 위의 질의를 다음과 같이 해킹을 완료

select card_type = 
    case substring(pan,1,2) 
        when '30' then 'Diners'
        ...
        when '37' then 'AMEX'
        ...
        when '39' then 'Diners'
        when '40' then 'VISA'
        ...
        when '49' then 'VISA'
        when '50' then 'MasterCard'  
        ...
        when '59' then 'MasterCard'  
        else 'unknown' 
    end,count(*),
    sum(amount)
from transactions
group by card_type

있는 우아한 방법으로의 그룹에 의해 첫번째 자리에서 모든 경우를 제외하고는 첫 번째 두 자리 숫자와 일치하는 특별한 경우?

또한 아무 생각이 없하는 방법 제목 이 질문하면 사람을 돕고 싶다.

편집:나의 값을 마스터 카드 및 비자 혼합,그래서 그냥을 정확:)

도움이 되었습니까?

해결책

다음과 같은 사례 문장을 수행 할 수 있습니다.

select case
    when substring(pan,1,2) = '37' then 'AMEX'
    when substring(pan,1,1) = '3' then 'Diners'
    when substring(pan,1,1) = '4' then 'Mastercard'
    when substring(pan,1,1) = '5' then 'VISA'
    else 'unknown' 
end,
count(*),
sum(amount)
from transactions
group by card_type

다른 팁

시스템에 대해서는 확실하지 않지만 Oracle Case 표현식에서는 정확히 이루어 지므로 중첩 할 수 있습니다.

case substring(pan,1,1)
        when '3' then case substring(pan,2,1)
                             when '7' then 'Amex'
                             else 'Diners'
                      end
        when '4' then 'VISA'
        when '5' then 'MasterCard'  
        else 'unknown'
end

할 수 있습 저장한 카드 유형 열에 당신의 테이블과 FK 카드 유형 테이블이나려고 다음과 같습니다.

CASE
    WHEN LEFT(pan,2)='37' then ...
    WHEN LEFT(pan,1)='3' then ...
    .....

편집
당신이 정말로 저장하는 것이 좋 카드 입력값에서 테이블에 있습니다.결정 그것은 한 번에 삽입할 때 다음 당신은 쿼리할 수 있는 데이터 없음을 통해 이러한 농구됩니다.당신은 또한 자신을 보호하는 경우 알고리즘은 변경 어떤 시점에서,모든 기존 데이터를 올바른 것입니다

개인적으로, 나는 당신의 'longhand'방식이 @samjudson의 답을 찾을 수있는 것보다 읽고 유지하기가 쉽다는 점에서 우아하다고 생각합니다 (그러나 나는 그들의 접근 방식의 매력을 봅니다). 당신은 사용할 수 있습니다 OR 케이스 당 하나 이상의 값을 테스트합니다. 나는 찾았다 LIKE 읽기 쉽지만 그냥 나일 수 있습니다;) 예 :

CASE
   WHEN card_type LIKE '37%' 
      THEN 'AMEX'
   WHEN (
         card_type LIKE '30%' 
         OR card_type LIKE '39%' 
        )  
      THEN 'Diners'
   WHEN (
         card_type LIKE '40%' 
         OR card_type LIKE '49%' 
        ) 
      THEN 'VISA'
   WHEN (
         card_type LIKE '50%' 
         OR card_type LIKE '59%' 
        ) 
      THEN 'MasterCard'  
   ELSE 
      'unknown' 
END
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top