在书中看到了一段关于条形码校验的标准SQL,尝试着将其用oracle 实现, 那知水平太浅,遂去论坛向大侠们讨教, 长进了不少,再次谢谢大家了,
本文将高手们的妙招,结果及相关知识整理出来。以便随时查看。
条形码的检验规则如下:
(1):计算各奇数位的和得到S1;
(2):计算各偶数位的和得到S2;
条形码的校验和位的计算公式是: ABS(MOD((s1-s2),10))
标准SQL语句如下:
CREATE FUNCTION Barcode_CheckSum(IN my_barcode CHAR(12))
RETURNS INTEGER
RETURN
( SELECT ABS(SUM(CAST ( SUBSTRING( barcode FROM Weights.seq FOR 1) AS INTEGER) * Weights.wgt))
FROM ( VALUES (CAST( 1 AS INTEGER), CAST( -1 AS INTEGER)),
( 2, +1),( 3, -1),( 4, +1),( 5, -1),( 6, +1),( 7, -1),( 8, +1),( 9, -1),( 10, +1),( 11, -1),( 12, +1)) AS Weights(seq, wgt)
WHERE barcode NOT SIMILAR TO '%[^0-9]%');
上面的sql中有两个技巧,
技巧1:判断参数全部有数字组成,similar to 双重否定,
技巧2:values()表达式构造了一个表常量,
且看大侠们是怎样处理。
- 1. 方法一: