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?
你好,我是用PostegreSQL,我想限制某一号码(税号)遵守以下规则:SQL复数约束
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?
是的,虽然很麻烦也可以。它看起来像这样:
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
)
就我个人而言,我将它封装在一个函数中,而不是使用函数。
为什么不使用PL/pgSQL函数(这将接近英语需求的音译)而不是那些令人不快的'substring's? –
这个答案似乎很好用,谢谢!是否可以通过将重复的操作存储在变量中来避免过多的代码行?我很抱歉我的sql知识有点生锈,但我rembember存储一些值 – galseth
PL/pgSQL函数会更好,但这会迫使我使用函数,当我需要添加一个新的值,而不是一个灵活的SQL查询正确吗?或者我可以创建一个触发器/约束来调用“Select function()”并验证它是否返回true? – galseth