我有一个表,其中的一列包含用于匹配其他表中的行的正则表达式. 然后我需要像这样查询

SELECT st.id
FROM some_table st
WHERE '1234' REGEXP st.regexp;

只要regexp列包含有效的表达式或NULL,查询就可以正常运行. 但是,如果任何行中都有无效的regexp,则整个查询将失败,并显示错误3685. 因此,几乎不可能找到错误所在,因为没有用于验证正则表达式的函数. 像VALID_REGEXP()这样的函数可以这样解决这个问题

SELECT *
FROM some_table st
WHERE NOT VALID_REGEXP(st.regexp);

我通过执行以下操作来验证插入/更新

SELECT '' REGEXP 'regexp-to-test'

但是,如果一个无效的表达式找到了自己的方式,就没有办法在数百万行中找到它,因为您必须逐个测试它们并查找错误3685.

对于如何在一个查询中找到regexp列中具有无效正则表达式的所有行,有什么建议吗?

SELECT '' REGEXP <expression>

将让我知道它是否有效,因为它将返回一行,而如果失败,它将返回错误3685. 但是,逐行测试不是一种 Select ,因为需要测试大量的行.

推荐答案

因为MySQL没有内置的正则表达式验证器函数,所以您将需要使用类似于shell 脚本的东西来测试和报告表中的所有正则表达式模式-but之后,您可以通过添加CHECK约束来防止将来发生这种情况,该约束针对存储在同一行中的已知匹配(或已知不匹配)运行存储的正则表达式模式:如果它是无效的正则表达式,则CHECK约束将失败,从而防止将来将无效模式存储在表中.

第1部分:验证shell 中的模式:

Using this QA as a sourcethis one too.

mysql -e "SELECT pattern FROM my_patterns" | while read pattern; do
    
    echo "foobar" | grep "^${pattern}"

done

您需要根据每个grep的运行情况手动更新数据.

Part 2: Prevent invalid patterns from being stored with a CHECK constraint:

例如:

CREATE TABLE my_patterns (
  patId   int          NOT NULL AUTO_INCREMENT,
  pattern varchar(255) NOT NULL,
  test    varchar(50)  NOT NULL,
  
  CONSTRAINT PK_patterns PRIMARY KEY ( patId ),
  
  CONSTRAINT CK_pattern_test CHECK ( REGEXP_LIKE( test, pattern ) = 1 )
);

INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\d\\d', '123' ); -- OK

INSERT INTO my_patterns ( pattern, test ) VALUES ( '\\d\\w\\d', '1a3' ); -- OK

INSERT INTO my_patterns ( pattern, test ) VALUES ( '][', 'aaa' ); -- fails due to invalid pattern

Schema Error:违反Check Constraint‘CK_pattern_test’.

Live example.

Mysql相关问答推荐

对象NotExecutabletry 在远程SQL服务器上执行SQL时出错,并使用SQLAchemy.Create_engine

Google Sheet查询以提取数据并用值替换复选框.(差异)

如果WHERE语句包含所有列,唯一键顺序是否重要?

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

用于将具有多个状态更改日期列的单行转换为具有状态和时间戳的多行的SQL查询

Python MySQL-无法从数据库中删除行

Ballerina SQL 中是否也应该考虑输入清理?

Hibernate 不创建表'

布尔值之间的 SQL less/greater 比较会产生意外结果

基于关系的每个实体有一个真值和多个假值

将 wordpress 自定义字段转换为单个数组

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

MySQL时区更改?

在 Android 上运行 AMP (apache mysql php)

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

INSERT ... 使用 WHERE 进行重复的密钥更新?

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

如何将 mysqldump 的输出拆分为较小的文件?

Python 是否支持 MySQL 准备好的语句?