2014-03-24 2 views
1

안녕하세요 PostegreSQL를 사용하고 그리고 난 다음의 규칙에 순종하는 특정 수 (세금 ID 번호)를 제한하려는 :SQL 복소수 제약

  • 9는 숫자
  • 마지막 숫자 (Z)가 계산된다

X = 8 * 7 * 2 + 3 + 4 + 6 * 5 * 5 * 네번째 + 6 + 7 + 3 * 2 * 1 + 8 + 9

y = x % 11 
if (y == 0 || x == 1) z = 0; 
else z = 11 - y 
,691 : 항

SQL에서 가능합니까?

답변

0

네, 성 가시지만 가능합니다. 다음과 같이 보입니다 :

check ((col regexp_matches '^[0-9]{9}$) and 
     (case when (substring(col, 1, 1) * 9 + substring(col, 2, 1) * 8 + substring(col, 3, 1) * 7 + 
        substring(col, 4, 1) * 6 + substring(col, 5, 1) * 5 + substring(col, 6, 1) * 4 + 
        substring(col, 7, 1) * 3 + substring(col, 8, 1) * 2 
       ) % 11 = 0 or 
        (substring(col, 1, 1) * 9 + substring(col, 2, 1) * 8 + substring(col, 3, 1) * 7 + 
        substring(col, 4, 1) * 6 + substring(col, 5, 1) * 5 + substring(col, 6, 1) * 4 + 
        substring(col, 7, 1) * 3 + substring(col, 8, 1) * 2 
       ) = 1 
      then 0 
      else 11 - 
        ((substring(col, 1, 1) * 9 + substring(col, 2, 1) * 8 + substring(col, 3, 1) * 7 + 
        substring(col, 4, 1) * 6 + substring(col, 5, 1) * 5 + substring(col, 6, 1) * 4 + 
        substring(col, 7, 1) * 3 + substring(col, 8, 1) * 2 
        ) % 11 
       ) 
     end) = substring(col, 9, 1) + 0 
    ) 

개인적으로 필자는이를 함수에 캡슐화하고 함수를 대신 사용합니다.

+0

불쾌한 더미 문자열 대신에 PL/pgSQL 함수 (영어 요구 사항의 음역에 가까운)를 사용해야하는 이유는 무엇입니까? –

+0

이 답변은 잘 작동하는 것 같습니다. 감사합니다. 변수에 반복 된 연산을 저장하여 과도한 코드 라인을 피할 수 있습니까? 죄송합니다 내 sql 지식을 비트 녹이지만 일부 값을 저장하는 rembember – galseth

+0

PL/pgSQL 함수를 더 좋을 것이라고하지만 내가 새로운 값을 추가하고 유연한 SQL 쿼리를 오른쪽으로 추가 할 필요가 때 기능을 사용하도록 강요 할 것이라고? 아니면 방금 "선택 함수()"를 호출하고 사실을 반환 확인 트리거/제약 조건을 만들 수 있습니까? – galseth