2014-03-24 130 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