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