如何在ORACLE中查找记录中的偶数位字母和奇数位字母
请查找以下计算支票数字的规则。客户编号将为8位数字。前7位为一系列,第8位为校验位,如下所示: 将运行编号的所有奇数位数字相加 将运行编号的所有偶数位数字相加 将以上两项之和相乘 取和的模10 因此,根据上述规则,第一个账号为: 第一部分:0030001 奇数位位数之和:0+3+0+1=4 偶数位位数之和:0+0+0=0 上述两个总和的乘积:4x0=0 上述乘积的模10=0 完整的帐号=00300010 第二个帐号: 第一部分:0030002 奇数位位数之和:0+3+0+2=4 偶数位位数之和:0+0+0=0 上述两个总和的乘积:4x0=0 上述乘积的模10=0 完整的帐号=00300020 还需要在帐号格式中维护以下内容 每个账户的长度必须为8位,7位运行编号和一位支票数字,即最后一位 前导零必须在那里 运行编号必须从30001开始 将oracle标记作为提示,但不允许评论如何在ORACLE中查找记录中的偶数位字母和奇数位字母,oracle,Oracle,请查找以下计算支票数字的规则。客户编号将为8位数字。前7位为一系列,第8位为校验位,如下所示: 将运行编号的所有奇数位数字相加 将运行编号的所有偶数位数字相加 将以上两项之和相乘 取和的模10 因此,根据上述规则,第一个账号为: 第一部分:0030001 奇数位位数之和:0+3+0+1=4 偶数位位数之和:0+0+0=0 上述两个总和的乘积:4x0=0 上述乘积的模10=0 完整的帐号=00300010 第二个帐号: 第一部分:0030002 奇数位位数之和:0+3+0+2=4 偶数位位数之和:
WITH
Input (str, note) AS (
SELECT '00300010', 'OK' FROM DUAL UNION ALL
SELECT '00300020', 'OK' FROM DUAL UNION ALL
SELECT '00300025', 'check digit wrong' FROM DUAL UNION ALL
SELECT '00200010', '< 30001' FROM DUAL UNION ALL
SELECT '0300010', 'too short' FROM DUAL UNION ALL
SELECT '000200010', 'too long' FROM DUAL UNION ALL
SELECT 'a0300025', 'not a number' FROM DUAL
)
SELECT
str
, note
, CASE
WHEN REGEXP_REPLACE(str, '\d{8}', '', 1, 1, '') IS NULL AND
TO_NUMBER(SUBSTR(str, 1, 7)) > 30000 AND
MOD((TO_NUMBER(SUBSTR(str, 1, 1)) +
TO_NUMBER(SUBSTR(str, 3, 1)) +
TO_NUMBER(SUBSTR(str, 5, 1)) +
TO_NUMBER(SUBSTR(str, 7, 1)))
*
(TO_NUMBER(SUBSTR(str, 2, 1)) +
TO_NUMBER(SUBSTR(str, 4, 1)) +
TO_NUMBER(SUBSTR(str, 6, 1))),
10)
= TO_NUMBER(SUBSTR(str, 8, 1))
THEN 'TRUE'
ELSE 'FALSE'
END valid
FROM Input
;
返回
| STR | NOTE | VALID |
|-----------|-------------------|-------|
| 00300010 | OK | TRUE |
| 00300020 | OK | TRUE |
| 00300025 | check digit wrong | FALSE |
| 00200010 | < 30001 | FALSE |
| 0300010 | too short | FALSE |
| 000200010 | too long | FALSE |
| a0300025 | not a number | FALSE |
它使用SUBSTRstr,1,1获得相应的数字…一切正常…您希望从中得到什么