3

现有数据库包含一个名为“dependent_ages”的字段,一些示例数据看起来像“1,2,5”或“1yo and 3mo”或“4mo”。

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

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

SELECT REGEXMATCHES(dependent_ages) as dependent_no ...

更新

一些答案/评论显示了对这个问题的一些普遍误解,所以我澄清了这个问题。

4

3 回答 3

1

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

您也许可以使用存储程序

  • 从...开始:'son: 10yr * daughter: 5yr * son:6mo'
  • 第一遍:用==>替换"*"字符串中的所有内容""'son: 10yr daughter: 5yr son:6mo'
  • 第二遍:用a替换数字序列"*"(所以"15"变成"*")==>'son: *yr daughter: *yr son:*mo'
  • 第三遍:将 non- 替换"*"""==>'***'
  • 第四遍:返回字符串(3)的长度。

对于大量记录来说,这将是缓慢而繁琐的,但它会让你留在 MySQL 中。您可能还想考虑使用其他工具来下载行,进行处理,然后上传结果。

于 2013-03-01T14:09:00.507 回答
0

如果我理解正确,这就是你所需要的。

select count(*) from `table` where `dependent_ages` rlike 'HERE-REGEX'
于 2013-02-28T22:09:55.333 回答
0

我认为你需要这样的东西:

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

在此处查看小提琴。

于 2013-02-28T22:17:50.763 回答