我有一个表,其中一列包含用于匹配其他表中的行的正则表达式。然后我需要这样查询
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。但是,逐行测试并不是一种选择,因为有大量的行需要测试。
1条答案
按热度按时间yhxst69z1#
因为MySQL没有内置的正则表达式验证器函数,你需要使用类似shell脚本的东西来测试和报告表中的所有正则表达式模式-但是在你这样做之后,你可以通过添加一个
CHECK
约束来防止将来发生这种情况,该约束针对存储在同一行中的已知匹配(或已知不匹配)运行存储的正则表达式模式:如果它是一个无效的正则表达式,那么CHECK
约束将失败,从而防止将来在表中存储无效的模式。Part 1:shell中的模式:
Using this QA as a source和this one too。
您需要根据每个
grep
的运行情况手动更新数据。Part 2:防止无效模式被
CHECK
约束存储:举例来说:
架构错误:检查约束'
CK_pattern_test
'被违反。Live example。