2014-03-24 43 views
1

你好,我是用PostegreSQL,我想限制某一號碼(稅號)遵守以下規則:SQL複數約束

  • 9位數
  • 最後一位(z)的計算根據:

X =第八* 2 +第七* 3 +第六* 4 +第五* 5 + 4 * 6 +第三* 7 +第二* 8 +第一+ 9

y = x % 11 
if (y == 0 || x == 1) z = 0; 
else z = 11 - y 

這是可能的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函數(這將接近英語需求的音譯)而不是那些令人不快的'substring's? –

+0

這個答案似乎很好用,謝謝!是否可以通過將重複的操作存儲在變量中來避免過多的代碼行?我很抱歉我的sql知識有點生鏽,但我rembember存儲一些值 – galseth

+0

PL/pgSQL函數會更好,但這會迫使我使用函數,當我需要添加一個新的值,而不是一個靈活的SQL查詢正確嗎?或者我可以創建一個觸發器/約束來調用「Select function()」並驗證它是否返回true? – galseth