子串的右侧位置 MySQL

Right hand side position of substring MySQL

我需要从 audit/log table 中删除 SSN,我们无法更改申请。

应用程序将 audit/log 生成到 table 'redcap_log_event',第 'sql_log' 列。此列只是应用程序在应用程序中执行每个命令时使用的一长串 SQL。

这是sql_log列的例子,复制粘贴出来,回车returns在SQL列的字符串中。插入最终出现在应用程序的 sql_log 列中 -

INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'study_id', '123456789', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'cmr_date', '2015-09-02', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'first_name', 'bnm', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'last_name', 'asdfggh', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'dob', '2015-09-02', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'age_at_cmr', '21', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'social_security_number', '987582154', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'sex', '1', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'ethnicity', '1', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'demographics_abef_complete', '2', NULL);
 INSERT INTO redcap_data (project_id, event_id, record, field_name, value, instance) VALUES (6, 21, 'Ashby, zbn', 'participant_id', 'asdfggh, zbn', NULL)

我想最终通过 table 上的触发器从上述数据中删除 9 位 SSN 值,但现在我正在努力获取子字符串、正则表达式、定位如何工作我需要它 - 文本 'social_security_number' 在列 sql_log 中的位置将始终不同,因为在它之前插入了名字和姓氏,所以我需要以某种方式在 [= 的右侧找到一个不同的位置=24=]

任何想法表示赞赏!

感谢您的反对票,我看到了友好的社区。无论如何,这就是我完成的:-

USE `ctsiredcap`;
DROP procedure IF EXISTS `SsnBlankOutInsert`;

DELIMITER $$
USE `ctsiredcap`$$
CREATE PROCEDURE `SsnBlankOutInsert` ()
BEGIN
UPDATE redcap_log_event 
SET 
    sql_log = CONCAT(SUBSTR(sql_log,
                1,
                LOCATE('social_security_number', sql_log) + 25),
            '*********',
            SUBSTR(sql_log,
                LOCATE('social_security_number', sql_log) + 35)),
    data_values = CONCAT(SUBSTR(data_values,
                1,
                LOCATE('social_security_number', data_values) + 25),
            '*********',
            SUBSTR(data_values,
                LOCATE('social_security_number', data_values) + 35))
WHERE
    ts > REPLACE(REPLACE(REPLACE(NOW() - INTERVAL 10 MINUTE,
                '-',
                ''),
            ':',
            ''),
        ' ',
        '')
        AND LOCATE('social_security_number', sql_log) > 0;
END$$

DELIMITER ;

无论如何都不漂亮,但它似乎在做这项工作

谢谢, 艾伦