【问题标题】:Right hand side position of substring MySQL子字符串 MySQL 的右侧位置
【发布时间】:2015-09-09 14:53:25
【问题描述】:

我需要从审计/日志表中清除 SSN,我们无法更改应用程序。

应用程序在表“redcap_log_event”的“sql_log”列中生成审计/日志。此列只是在应用程序中执行每个命令时应用程序使用的一长串 SQL。

这是 sql_log 列的示例,当您将其复制并粘贴出来时,回车符在该列的 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)

我希望最终通过表格上的触发器从上述数据中清除 9 位 SSN 值,但现在我正在努力获取子字符串、正则表达式、定位以按照我的需要工作 - 的sql_log 列中文本“social_security_number”的位置总是不同,因为在它之前插入了名字和姓氏,所以我需要以某种方式在“social_security_number”的右侧找到一个不同的位置

任何想法表示赞赏!

【问题讨论】:

  • MySQL 似乎还不支持正则表达式的替换功能。您可能必须尝试使用​​来自外部库的用户定义函数 (UDF):MySQL UDF with Regex
  • 如果可以使用正则表达式,它可以用这个来完成:/(?<=social_security_number', )('\d{9}')/Ug (demo)
  • 谢谢。正则表达式在 MySQL 中可用,但我不确定我是如何将该 sql 实现到语句中的?

标签: mysql regex position substring locate


【解决方案1】:

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

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 ;

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

谢谢, 艾伦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2016-04-15
    • 2022-12-05
    • 2021-09-02
    • 2018-08-15
    相关资源
    最近更新 更多