如何计算MySQL中给定字符串的匹配数?

如何计算MySQL中给定字符串的匹配数?,mysql,regex,Mysql,Regex,现有数据库包含一个字段调用“dependent_ages”,一些示例数据看起来像“1,2,5”或“1yo和3mo”或“4mo” 要求将这样的字符串转换为整数,整数是由“,”或“and”分隔的子字符串数。更准确地说,分隔符可以描述为正则表达式“,|\sand\s”。对于上面的例子,转换后的整数是3,2和1。基本上,我感兴趣的是存在多少匹配项,而不是这些匹配项的值。因此,无论单个值是“14yo”还是“4mo”,它都将被计算为1 例如,问题是找到一个可以实现这一点的MySQL表达式 SELECT RE

现有数据库包含一个字段调用“dependent_ages”,一些示例数据看起来像“1,2,5”或“1yo和3mo”或“4mo”

要求将这样的字符串转换为整数,整数是由“,”或“and”分隔的子字符串数。更准确地说,分隔符可以描述为正则表达式“,|\sand\s”。对于上面的例子,转换后的整数是3,2和1。基本上,我感兴趣的是存在多少匹配项,而不是这些匹配项的值。因此,无论单个值是“14yo”还是“4mo”,它都将被计算为1

例如,问题是找到一个可以实现这一点的MySQL表达式

SELECT REGEXMATCHES(dependent_ages) as dependent_no ...
UPADTE


一些回答/评论显示了对问题的一些普遍误解,因此我澄清了问题。

如果我理解正确,这就是您需要的

select count(*) from `table` where `dependent_ages` rlike 'HERE-REGEX'

我想你需要这样的东西:

SELECT
  col,
  CASE WHEN COALESCE(col, '')='' THEN 0
  ELSE
    length(col)-length(replace(col, ',', ''))+
    (length(col)-length(replace(col, ' and ', ''))) DIV 5
    +1
  END
FROM
  yourtable

请参阅fiddle。

基于MySQL的文档,我认为除了使用正则表达式比较返回true(1)或false(0)之外,不可能做任何事情。您不能返回匹配项,也不能返回匹配数。我认为您甚至不能使用正则表达式来执行替换

您可能可以使用:

  • 从:
    “儿子:10岁*女儿:5岁*儿子:6岁”开始
  • 首次通过:将字符串中的所有
    “*”
    替换为
    ==>
    “儿子:10岁女儿:5岁儿子:6岁”
  • 第二步:将数字序列替换为一个
    “*”
    (因此
    “15”
    变成
    “*”
    )==>
    “儿子:*女儿:*儿子:*mo”
  • 第三遍:将非“*”替换为“
    ==>
    ”***'
  • 第四遍:返回字符串的长度(3)

对于大量的记录来说,这将是一个缓慢而复杂的过程,但它会让您保持在MySQL中。您可能还想考虑使用另一个工具来下载行,进行处理,然后上传结果。

示例数据是如何导致整数3, 2和1的?自然语言不是正则的,一般不是正则表达式可解析的。也就是说,您可以使用
\d+
提取所有独立的数字(因此从
14yr、9yr
可以得到
14
9
)。当然,没有办法区分9岁和9个月。@Cyborgx37我想你不明白我的意思。该字段描述一个人的孩子年龄,我想要的是他/她的孩子数量。因此,无论年龄是14岁、14个月还是15岁都无关紧要,所有这些都将被视为1个孩子。@TomMac请查看我之前的评论和我更新的文本。最好的办法是从SQL获取数据,使用类似Perl的东西对其进行解析(这可能需要一些努力),然后将其转换为更合适的形式,以便SQL进行处理。在此阶段更改表格。IMHOSQL不是做这类事情的合适工具。这是一个聪明的答案。但是,它不使用正则表达式,因此它仅适用于此示例。如果使用了更复杂的模式呢?不管怎样,我+1你的答案。这一个也是输入失败“Torand:1yo,Tarkel:3mo”。根据给定的正则表达式,它应该返回2。您的代码返回3。@EartEngine我更新了答案,现在它可以在您的输入上工作。毫无疑问,MySql对正则表达式的支持非常重要limited@EarthEngine-也许你第一次问得不太好?你的更新更清晰。