2010-02-08 4 views
3

이 테이블을 가지고 Val을 사용하여 Indata를 맞는 행을 찾고 싶습니다.SQL의 코딩 된 필드 해석

Tol 필드는 공차 (varchar)이며 정수/부동 또는 백분율 값일 수 있습니다.

Row Val Tol Outdata 
1 24 0  A 
2 24 5  B 
3 24 10 C 
4 32 %10 D 
5 32 1  E 

예를 들어 Indata 30은 행 3 (24 + 10 = 34)과 4 (32-10 % = 28.8)와 일치해야합니다.

mySQL에서이 작업을 수행 할 수 있습니까? 함수 만들기?

답변

1

테스트를 위해 MySQL을 설치하지 않았지만이 예제는 Oracle SQL 구문에서 변환됩니다. 문자열 함수를 사용하여 tol이 백분율인지 확인하고 그에 따라 해당 필드의 최소 및 최대 범위를 계산해야합니다. 그런 다음 between 절을 사용할 수 있습니다.

select * 
    from (select t.*, 
       case when substr(tol, 1, 1) = '%' then 
         t.val * (1 + convert('.' + substr(tol, 2), number)) 
        else 
         t.val + convert(tol, number) 
       end maxval, 
       case when substr(tol, 1, 1) = '%' then 
         t.val * (1 - convert('.' + substr(tol, 2), number)) 
        else convert(t.val - tol, number) 
       end minval 
      from mytable 
     ) t 
where 30 between minval and maxval 
; 
+0

고마워, 아직 시도하지는 않았지만 이것이 내가 찾고 있었던 것이었다! 그러나 30이 이상하게 보입니다 .... –

+0

"% 10"대신 "10 %"를 입력하면 어떻게됩니까? 이것은 깨지기 쉬운 해결책입니다. –

+0

@Petter Magnusson : 예를 들어 Indata 30은 행 3과 4와 일치해야합니다. 비교할 값으로 대체하십시오. –

1

물론 가능합니다. 그러나 정규화와의 충돌로 데이터베이스 디자인을 검토하는 것이 좋습니다. 간략한 개요는 http://en.wikipedia.org/wiki/Database_normalization을 참조하십시오.

+0

감사합니다, 알고 있습니다 .... ;-) –

2

이것은 테이블과 컬럼 디자인으로 MySQL에서하기가 다소 어려울 것입니다. 어떤 종류의 비교를 수행해야하는지 어떻게 차별화 할 계획입니까? 문자열 비교를 통해 varchar 필드에 백분율 기호가 있는지 확인합니다.

허용 범위 필드를 (최소한) 두 개의 int/float 열로 나누는 것이 좋습니다 (예 : toltol_pct). 유연성을 위해 tol_pct을 10 진수 (10 % => .10)로 표시합니다. 그런 다음 아래와 같은 쿼리를 수행 할 수 있습니다.

select * 
from table 
where 
    (Indata between Val - tol and Val + tol) 
    or (Indata between Val * (1 + tol_pct) and Val * (1 - tol_pct)) 
+0

MySQL이 NULLS를 처리하는 방법을 잘 모르지만 여기에 몇 가지 확인을 추가해야 할 수도 있습니다. Val - coalesce (tol, 0) 사이의 Indata ... – Bill

+0

현재 처분 할 수있는 MySQL 인스턴스가 없으므로이를 OP 용 연습으로 남겨 두겠습니다. where 절의 각 "branch"는'tol is not null AND ... '와 같은 접두사가 붙을 수도 있습니다. –

+0

저는이 해결책을 알고 있었고 제가가는 길을 잘 알고 있었지만이 질문에 대해서는 제가 원했던 것입니다. 만약에 다른 방법으로 할 수 있다면 안다. 어쨌든 고마워! –