mysql如何用函数实现组织机构代码校验

mysql如何用函数实现组织机构代码校验,要求使用函数实现,不用过程。


DELIMITER //

CREATE FUNCTION code(code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
    DECLARE len, i, sum, mod, weight INT;
    DECLARE digit, checkCode CHAR(1);
    DECLARE codeArray CHAR(20);
    
    SET len = LENGTH(code);
   
    IF len <> 9 THEN
        RETURN FALSE;
    END IF;
 
    IF code REGEXP '^[0-9A-Z]{8}[0-9X]$' = 0 THEN
        RETURN FALSE;
    END IF;
    
    SET codeArray = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    SET weight = 3;
    SET sum = 0;
    
   
    FOR i = 1 TO 8 DO
        SET digit = SUBSTRING(code, i, 1);
        SET mod = INSTR(codeArray, digit) - 1;
        SET sum = sum + mod * weight;
        SET weight = IF(weight = 1, 3, weight - 1);
    END FOR;
    
    SET mod = (11 - (sum % 11)) % 11;
    SET checkCode = SUBSTRING(code, 9, 1);
    

    IF mod = 10 THEN
        RETURN checkCode = 'X';
    ELSE
        RETURN checkCode = CAST(mod AS CHAR);
    END IF;
    
END //

DELIMITER ;

SELECT code('这里填接收参数,最后返回的是一个bool值');

你直接使用外键约束是可以的

ALTER TABLE table1
ADD FOREIGN KEY (column1)
REFERENCES table2 (column2);

table1 是包含外键的表,column1 是外键字段;table2 是被引用的表,column2 是被引用的字段。

如果 column1 中的值在 table2 的 column2 中不存在,那么插入或更新操作将会失败,从而判断该字段在 table2 中不存在。

组织机构代码通常具有特定的格式和规则,例如中国的组织机构代码是由8位数字或字母组成。下面是一个MySQL函数,用于校验组织机构代码是否符合这种格式。

DELIMITER //  
CREATE FUNCTION ValidateOrgCode(org_code VARCHAR(20))  
RETURNS BOOLEAN  
BEGIN  
    DECLARE pattern VARCHAR(20) DEFAULT '[0-9A-Z]{8}';  
    DECLARE result INT DEFAULT 0;  
      
    IF org_code REGEXP pattern THEN  
        SET result = 1;  
    END IF;  
      
    RETURN result;  
END //  
DELIMITER ;

这个函数使用了正则表达式来检查输入的组织机构代码是否符合指定的格式。函数接受一个参数org_code,这个参数应该是一个字符串。如果输入的代码符合指定的格式,函数将返回1,否则返回0。

你可以这样使用这个函数:

SELECT ValidateOrgCode('12345678') AS valid;

这将返回1,因为'12345678'是一个8位的数字字符串,符合组织机构代码的规则。

请注意,这个函数只检查代码的长度和字符类型,不检查代码是否真实存在。如果你需要验证代码的真实性,你可能需要连接到相应的数据库或数据源。

【以下回答由 GPT 生成】

MySQL中可以使用函数来实现组织机构代码的校验。下面是一个具体的解决方案:

首先,创建一个函数,可以通过正则表达式来校验组织机构代码的格式是否合法。可以使用MySQL的内置函数REGEXP来进行正则表达式匹配。

DELIMITER //

CREATE FUNCTION ValidateOrgCode(orgCode VARCHAR(20)) RETURNS INT
BEGIN
  DECLARE valid INT DEFAULT 0;

  -- 校验组织机构代码是否符合格式(9位数字或字母+1位数字或字母或X)
  IF orgCode REGEXP '^[A-Z0-9]{8}[0-9X]$' THEN
    SET valid = 1;
  END IF;

  RETURN valid;
END //

DELIMITER ;

以上代码中,创建了一个名为ValidateOrgCode的函数,接受一个组织机构代码作为参数,并返回一个整数值(1表示校验通过,0表示校验失败)。

接下来,可以使用该函数来校验组织机构代码。以下是一个示例:

-- 校验合法的组织机构代码
SELECT ValidateOrgCode('12345678X'); -- 返回1

-- 校验非法的组织机构代码
SELECT ValidateOrgCode('12345678Y'); -- 返回0

通过调用ValidateOrgCode函数来校验组织机构代码,如果返回值为1,则表示校验通过;如果返回值为0,则表示校验失败。

请注意,该函数只能检测组织机构代码的格式是否合法,不能验证其真实性。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

组织机构代码是一种在很多国家用于标识法人、组织和机构的唯一代码。在MySQL中,你可以使用函数来实现组织机构代码的校验。以下是一个简单的示例,演示如何创建一个MySQL函数来验证组织机构代码的合法性。

假设组织机构代码由8位数字和1位校验码组成,其中校验码的计算方法如下:

1.将前8位数字分别与权重因子(3、7、9、10、5、8、4、2)相乘,然后将结果相加。
2.将上述结果除以11,并取余数。
3.根据余数值来计算校验码,余数为0时校验码为1,余数为1时校验码为0,余数为其他值时校验码通过(11减余数值)得到。
下面是一个在MySQL中实现组织机构代码校验的函数示例:


DELIMITER //

CREATE FUNCTION ValidateOrgCode(org_code VARCHAR(9)) RETURNS BOOLEAN
BEGIN
    DECLARE weight_factors VARCHAR(8) DEFAULT '379105824';
    DECLARE total_weight INT;
    DECLARE remainder INT;
    DECLARE check_digit INT;
    
    IF LENGTH(org_code) != 9 THEN
        RETURN FALSE;
    END IF;
    
    SET total_weight = 0;
    SET remainder = 0;
    
    -- Calculate the weighted sum of the first 8 digits
    SET total_weight = 
        SUBSTRING(org_code, 1, 1) * SUBSTRING(weight_factors, 1, 1) +
        SUBSTRING(org_code, 2, 1) * SUBSTRING(weight_factors, 2, 1) +
        SUBSTRING(org_code, 3, 1) * SUBSTRING(weight_factors, 3, 1) +
        SUBSTRING(org_code, 4, 1) * SUBSTRING(weight_factors, 4, 1) +
        SUBSTRING(org_code, 5, 1) * SUBSTRING(weight_factors, 5, 1) +
        SUBSTRING(org_code, 6, 1) * SUBSTRING(weight_factors, 6, 1) +
        SUBSTRING(org_code, 7, 1) * SUBSTRING(weight_factors, 7, 1) +
        SUBSTRING(org_code, 8, 1) * SUBSTRING(weight_factors, 8, 1);
    
    SET remainder = total_weight % 11;
    
    -- Calculate the check digit based on the remainder
    CASE
        WHEN remainder = 0 THEN SET check_digit = 1;
        WHEN remainder = 1 THEN SET check_digit = 0;
        ELSE SET check_digit = 11 - remainder;
    END CASE;
    
    -- Compare the calculated check digit with the provided check digit
    IF SUBSTRING(org_code, 9, 1) = check_digit THEN
        RETURN TRUE;
    ELSE
        RETURN FALSE;
    END IF;
END//

DELIMITER ;

使用上述函数,你可以在MySQL中检验组织机构代码的合法性。只需将组织机构代码作为参数传递给函数,函数将返回布尔值,表示代码是否合法。例如:

SELECT ValidateOrgCode('12345678X'); -- 返回 TRUEFALSE

请注意,上述示例是一个简化的实现,实际应用中可能需要更复杂的校验逻辑和错误处理。在实际生产环境中使用之前,请务必进行全面的测试。

参考gpt:
结合自己分析给你如下建议:
一种方法是使用正则表达式来验证组织机构代码的格式是否正确。组织机构代码由 9 位字符组成,前 8 位为数字或大写英文字母,最后一位为校验码,可以是数字或大写英文字母 X。校验码的计算方法是将前 8 位字符对应的数值乘以不同的权重,然后求和,再除以 11 取余数,最后根据余数得到校验码。您可以参考 MySQL 正则表达式 这篇文章,了解如何使用 REGEXP 函数来进行正则匹配。以下是一个示例函数,用于检查组织机构代码是否符合正则表达式:

CREATE FUNCTION check_org_code_format(code VARCHAR(9))
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
    -- 定义正则表达式
    DECLARE regex VARCHAR(20) DEFAULT '^[0-9A-Z]{8}[0-9A-ZX]$';
    -- 返回正则匹配结果
    RETURN code REGEXP regex;
END

另一种方法是使用自定义函数来计算并验证组织机构代码的校验码是否正确。您可以参考 MySQL 自定义函数 这篇文章,了解如何创建和使用自定义函数。以下是一个示例函数,用于计算并检查组织机构代码的校验码:

CREATE FUNCTION check_org_code_checksum(code VARCHAR(9))
RETURNS BOOLEAN
DETERMINISTIC
BEGIN
    -- 定义权重数组
    DECLARE weights ARRAY INT DEFAULT [3, 7, 9, 10, 5, 8, 4, 2];
    -- 定义校验码数组
    DECLARE checksums ARRAY CHAR DEFAULT ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X'];
    -- 定义变量存储前 8 位字符的数值和
    DECLARE sum INT DEFAULT 0;
    -- 定义变量存储余数
    DECLARE remainder INT;
    -- 定义变量存储实际校验码
    DECLARE actual_checksum CHAR;
    -- 定义变量存储期望校验码
    DECLARE expected_checksum CHAR;
    -- 循环遍历前 8 位字符
    FOR i IN 1..8 LOOP
        -- 获取第 i 位字符
        DECLARE char CHAR DEFAULT SUBSTR(code, i, 1);
        -- 判断字符是否为数字
        IF char BETWEEN '0' AND '9' THEN
            -- 将字符转换为数字并乘以权重,累加到 sum 中
            SET sum = sum + CAST(char AS INT) * weights[i];
        ELSEIF char BETWEEN 'A' AND 'Z' THEN
            -- 将字符转换为数字(A 对应 10,B 对应 11,依次类推)并乘以权重,累加到 sum 中
            SET sum = sum + (ASCII(char) - ASCII('A') + 10) * weights[i];
        ELSE
            -- 如果字符不是数字或大写字母,返回 FALSE
            RETURN FALSE;
        END IF;
    END LOOP;
    -- 计算余数
    SET remainder = sum % 11;
    -- 获取实际校验码(第 9 位字符)
    SET actual_checksum = SUBSTR(code, 9, 1);
    -- 获取期望校验码(根据余数在校验码数组中查找)
    SET expected_checksum = checksums[remainder + 1];
    -- 返回实际校验码和期望校验码是否相等的结果
    RETURN actual_checksum = expected_checksum;
END

你可以使用MySQL函数实现组织机构代码校验。组织机构代码是一个18位的标识码,由数字和大写字母组成。以下是一个示例函数,用于校验组织机构代码:

DELIMITER //

CREATE FUNCTION validate_organization_code(org_code VARCHAR(18))
RETURNS BOOLEAN
BEGIN
    DECLARE valid_pattern VARCHAR(50);
    SET valid_pattern = '^[0-9A-Z]{8}-[0-9X]{1}$';
    
    RETURN org_code REGEXP valid_pattern;
END //

DELIMITER ;

上述代码创建了一个名为validate_organization_code的函数,它接受一个org_code参数,并返回一个BOOLEAN值来表示组织机构代码的有效性。

函数内部使用正则表达式来定义有效的组织机构代码模式。模式^[0-9A-Z]{8}-[0-9X]{1}$指定了一个由8位数字和大写字母组成的字符串,后跟一个连字符(-),最后跟一个数字或大写字母X。

函数通过使用REGEXP运算符来检查org_code参数是否与有效模式匹配。如果匹配成功,函数返回TRUE,否则返回FALSE

你可以使用以下方式调用函数:

SELECT validate_organization_code('ABC12345-6X'); -- 返回 TRUE
SELECT validate_organization_code('12345678-9X'); -- 返回 TRUE
SELECT validate_organization_code('AB123456-7X'); -- 返回 FALSE

这样,你就可以根据上述函数来校验组织机构代码了。注意,函数内的正则表达式模式可以根据你的具体要求进行调整。

引自gpt:

DELIMITER //
CREATE FUNCTION validate_org_code(org_code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
    DECLARE pattern VARCHAR(20) DEFAULT '^[0-9A-Z]{6}\-[0-9A-Z]{4}$';
    DECLARE result BOOLEAN DEFAULT FALSE;
    
    IF REGEXP(org_code, pattern) THEN
        SET result = TRUE;
    END IF;
    
    RETURN result;
END //
DELIMITER ;

组织机构代码是要校验什么东西?

mysql如何用函数实现组织机构代码校验
举个例子

CREATE DEFINER=`tm` FUNCTION `func_check_credit_code`(v_card varchar(32)) RETURNS varchar(32) CHARSET utf8mb3
    DETERMINISTIC
BEGIN
-- 此函数用于校验明文统一社会信用代码
-- 校验通过返回 1
-- 校验不通过返回 0 
    DECLARE v_flag varchar(32) DEFAULT '';  -- 是否有效标志
    DECLARE v_sum INT DEFAULT 0;   -- 校验第一步求和
    DECLARE v_mod varchar(32) DEFAULT '';   -- 校验第二步取余
    DECLARE i_flag varchar(32) DEFAULT '';  -- 校验第三步计算校验位
    DECLARE v_cstr varchar(200) DEFAULT '';  
    DECLARE v_wstr varchar(200) DEFAULT '';  -- 加权因子字符串
    
-- 每一位对应的数字
    SET v_cstr = '0123456789ABCDEFGHJKLMNPQRTUWXY';
-- 对应数字的加权因子
    SET v_wstr = '1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28';
    
-- 长度不等于18为空
    IF LENGTH(v_card) <> 18 THEN
    RETURN 0;
    END IF;
    
-- 判断第一位登记管理部门代码
    IF SUBSTRING(v_card,1,1) NOT IN (1,2,3,4,5,6,7,8,9,'A','N','Y') THEN
    RETURN 0;
    END IF;
    
-- 判断第二位机构类别代码
-- 判断机构编制
    IF SUBSTRING(v_card,1,1) = 1 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,3,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断外交
    IF SUBSTRING(v_card,1,1) = 2 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断司法行政
    IF SUBSTRING(v_card,1,1) = 3 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,3,4,5,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断文化    
    IF SUBSTRING(v_card,1,1) = 4 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断民政
    IF SUBSTRING(v_card,1,1) = 5 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,3,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断旅游    
    IF SUBSTRING(v_card,1,1) = 6 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断宗教
    IF SUBSTRING(v_card,1,1) = 7 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断工会    
    IF SUBSTRING(v_card,1,1) = 8 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断工商    
    IF SUBSTRING(v_card,1,1) = 9 THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,3) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断中央军委改革和编制办公室
    IF SUBSTRING(v_card,1,1) = 'A' THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断农业
    IF SUBSTRING(v_card,1,1) = 'N' THEN
        IF SUBSTRING(v_card,2,1) NOT IN (1,2,3,9) THEN
        RETURN 0;
        END IF;
    END IF;
-- 判断其他
    IF SUBSTRING(v_card,1,1) = 'Y' THEN
        IF SUBSTRING(v_card,2,1) <> 1 THEN
        RETURN 0;
        END IF;
    END IF;

-- 判断区划代码前两位
    IF SUBSTRING(v_card,3,2) NOT IN (11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,83) THEN
    RETURN 0;
    END IF;
    
-- 求和
SET v_sum =  (INSTR(v_cstr, SUBSTR(v_card, 1, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',1)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 2, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',2)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 3, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',3)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 4, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',4)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 5, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',5)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 6, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',6)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 7, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',7)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 8, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',8)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 9, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',9)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 10, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',10)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 11, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',11)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 12, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',12)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 13, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',13)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 14, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',14)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 15, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',15)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 16, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',16)),',',1))+
(INSTR(v_cstr, SUBSTR(v_card, 17, 1)) - 1)*REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(v_wstr,',',17)),',',1));
    
-- 取余得到加权因子
SET v_mod = 31 - v_sum%31;
IF v_mod = 31 THEN 
    SET v_mod = 0 ;
END IF;

-- 判断校验位
SET i_flag = SUBSTR(v_cstr,v_mod+1,1);
IF i_flag = SUBSTRING(v_card,18,1) THEN
RETURN 1;
        ELSE
        RETURN 0;
    END IF;

END





DELIMITER //

CREATE FUNCTION ValidateOrganizationCode(org_code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
    DECLARE valid BOOLEAN DEFAULT FALSE;
    DECLARE code_len INT;

    -- 获取组织机构代码长度
    SET code_len = CHAR_LENGTH(org_code);

    -- 校验组织机构代码长度必须为 9 或 10
    IF code_len = 9 OR code_len = 10 THEN
        -- 校验组织机构代码格式
        IF org_code REGEXP '^[0-9A-HJ-NPQRTUWXY]{8}-[0-9X]$' THEN
            DECLARE i INT;
            DECLARE sum INT;
            DECLARE weight INT;
            DECLARE check_digit INT;
            SET sum = 0;
            SET weight = 3;

            -- 计算加权和
            FOR i = 1 TO 8 DO
                SET sum = sum + SUBSTRING(org_code, i, 1) * weight;
                SET weight = IF(weight = 3, 7, 3);
            END FOR;

            -- 计算校验位
            SET check_digit = (10 - sum % 10) % 10;

            -- 校验校验位
            IF check_digit = SUBSTRING(org_code, 10, 1) THEN
                SET valid = TRUE;
            END IF;
        END IF;
    END IF;

    RETURN valid;
END;
//

DELIMITER ;

用正则表达式语句吧。

要么用外键,要么用存储过程去操作

引用gpt作答

DELIMITER //

CREATE FUNCTION validate_organization_code(org_code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
    DECLARE valid BOOLEAN DEFAULT FALSE;
    DECLARE weight INT DEFAULT 3;
    DECLARE sum INT DEFAULT 0;
    DECLARE i INT DEFAULT 1;
    DECLARE char_value INT;

    IF LENGTH(org_code) <> 9 THEN
        RETURN valid;
    END IF;

    WHILE i <= 8 DO
        SET char_value = ASCII(SUBSTRING(org_code, i, 1)) - 48;
        SET sum = sum + char_value * weight;
        SET weight = IF(weight = 3, 1, 3);
        SET i = i + 1;
    END WHILE;

    SET sum = 10 - (sum % 10);
    SET sum = IF(sum = 10, 0, sum);

    IF sum = ASCII(SUBSTRING(org_code, 9, 1)) - 48 THEN
        SET valid = TRUE;
    END IF;

    RETURN valid;
END //

DELIMITER ;

结合GPT给出回答如下请题主参考
组织机构代码是由数字和字母组成的特定编码,用于唯一标识企事业单位、机关等组织,也是国家行政管理部门对组织机构的管理依据之一。其标准格式为18位,最后一位为验证码。

可以通过MySQL函数实现组织机构代码的校验。以下是一个实现组织机构代码校验的MySQL函数的示例代码:

DELIMITER $$

CREATE FUNCTION check_org_code(org_code VARCHAR(20))
RETURNS TINYINT
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE s INT DEFAULT 0;
    DECLARE ws INT DEFAULT 3;
    DECLARE weights VARCHAR(8) DEFAULT '37915842';
    DECLARE code_char CHAR(1);
    DECLARE c INT DEFAULT 0;
    DECLARE res TINYINT DEFAULT 0;
 
    IF LENGTH(org_code) != 18 THEN
        SET res = 0;
    ELSE
        WHILE i <= 17 DO
            SET code_char = SUBSTRING(org_code, i, 1);
            IF code_char BETWEEN '0' AND '9' THEN
                SET s = s + ws * CAST(code_char AS UNSIGNED);
            ELSEIF code_char BETWEEN 'A' AND 'Z' THEN
                SET c = ASCII(code_char);
                SET s = s + ws * (c - 55);
            END IF;
            SET ws = IF(ws = 1, 3, ws - 1);
            SET i = i + 1;
        END WHILE;
 
        SET res = (10 - (s % 10)) % 10 = RIGHT(org_code, 1);
    END IF;
 
    RETURN res;
END$$

DELIMITER ;

该函数的输入参数为组织机构代码,返回值为一个布尔值,表示校验结果。如果校验通过,则返回1;否则返回0。

该函数的实现方法为:

  1. 首先判断组织机构代码的长度是否为18位,如果不是则直接返回0,表示校验失败。

  2. 对前17位进行加权求和,并计算出校验码,与组织机构代码的最后一位进行比较,如果相等则表示校验通过,返回1;否则表示校验失败,返回0。

该函数的实现方法比较简单,但是由于涉及到加权求和等多个计算步骤,因此需要使用循环和条件语句等控制结构实现。

mysql用函数实现组织机构代码校验,使用函数实现。
参考资料:https://blog.csdn.net/weixin_74815451/article/details/132480060
或者:https://wenku.baidu.com/view/3c3caed5b3717fd5360cba1aa8114431b80d8e66.htm

mysql用函数实现组织机构代码校验,使用函数实现。
参考资料:https://blog.csdn.net/weixin_74815451/article/details/132480060
或者:https://wenku.baidu.com/view/3c3caed5b3717fd5360cba1aa8114431b80d8e66.htm

参考gpt
要在MySQL中使用函数实现组织机构代码的校验,可以按照以下步骤进行:

  1. 创建一个函数,用于校验组织机构代码的合法性。函数的定义如下:
CREATE FUNCTION validate_org_code(org_code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE sum INT DEFAULT 0;
    DECLARE weight INT DEFAULT 3;
    DECLARE digit INT;

    WHILE i <= 8 DO
        SET digit = SUBSTRING(org_code, i, 1);
        SET sum = sum + digit * weight;
        SET weight = IF(weight = 1, 3, weight - 1);
        SET i = i + 1;
    END WHILE;

    SET sum = 11 - (sum % 11);
    SET sum = IF(sum = 10, 'X', sum);
    SET sum = IF(sum = 11, '0', sum);

    RETURN sum = RIGHT(org_code, 1);
END;
  1. 使用上述函数进行组织机构代码的校验。可以在SELECT语句中调用函数,例如:
SELECT org_code, validate_org_code(org_code) AS is_valid FROM your_table;

组织机构代码校验可以使用MySQL内置函数和正则表达式进行实现。以下是一种方式:

首先,定义一个MySQL函数,传入一个组织机构代码参数,返回一个布尔值,表示该代码是否合法。

CREATE FUNCTION org_code_validate(org_code VARCHAR(20)) RETURNS BOOLEAN
BEGIN
  DECLARE valid BOOLEAN;

  SET valid = FALSE;

  -- 验证组织机构代码是否符合规则
  IF (org_code REGEXP '^[0-9A-Z]{8}-[0-9X]$') THEN
    DECLARE region_code VARCHAR(2);
    DECLARE org_type VARCHAR(1);
    DECLARE check_code VARCHAR(1);
    DECLARE factor INT;
    DECLARE sum INT;
    DECLARE check_sum INT;

    -- 解析组织机构代码中的区域代码、机构类型和校验码
    SET region_code = SUBSTRING(org_code, 1, 2);
    SET org_type = SUBSTRING(org_code, 3, 1);
    SET check_code = SUBSTRING(org_code, 9, 1);

    -- 计算校验码
    SET sum = 0;
    FOR i IN 1..8 DO
      SET factor = CASE i MOD 2 WHEN 0 THEN 2 ELSE 1 END;
      SET sum = sum + factor * CAST(CONV(HEX(ASCII(SUBSTRING(org_code, i, 1))) - 48, 10, 10) AS SIGNED);
    END FOR;

    SET check_sum = (10 - sum % 10) % 10;

    -- 验证校验码
    IF (check_sum = CAST(CONV(HEX(ASCII(check_code)) - 48, 10, 10) AS SIGNED)) THEN
      SET valid = TRUE;
    END IF;
  END IF;

  RETURN valid;
END;

上述代码中,使用了SUBSTRING、REGEXP、HEX、ASCII、CONV等函数进行字符串操作和数字转换。同时,使用了FOR循环和IF语句,实现了较为复杂的校验逻辑。

在函数定义完成后,就可以在SQL语句中使用该函数进行校验了,例如:

SELECT org_code, org_code_validate(org_code) AS valid FROM organizations;

上述SQL语句中,organizations表中包含组织机构代码,通过调用org_code_validate函数,返回每个代码是否合法的布尔值。

我使用了一个简单的逻辑,校验组织机构代码的长度是否为10,并且只包含数字和大写字母。你可以根据自己的需求来编写更复杂的校验逻辑。

CREATE FUNCTION validate_organization_code(org_code VARCHAR(20)) RETURNS INT
BEGIN
    DECLARE valid INT;
    
    -- 在这里编写组织机构代码校验逻辑
    -- 可以使用正则表达式或其他逻辑进行校验
    
    -- 示例逻辑:校验组织机构代码长度为10,并且只包含数字和大写字母
    SET valid = IF(LENGTH(org_code) = 10 AND org_code REGEXP '^[A-Z0-9]+$', 1, 0);
    
    RETURN valid;
END;