Mysql 寻找和替换角色的想法

Mysql 寻找和替换角色的想法,mysql,regex,excel,Mysql,Regex,Excel,我需要搜索地址字段,如果有公寓号码,则将一个字符改为大写。所以“521主街3b”将改为“521主街3b” 我知道这样做的方法是编写一个程序,在记录集中循环,查看地址字段中最后一个字符是否是字母,然后如果前面的字符是数字,更改最后一个字符的大小写并更新记录 使用正则表达式(从未使用过)会更快/更简单吗? 如果是这样,最好是在编程环境中完成,还是使用文本编辑器(如Textmate或vi)?数据在MySQL和Excel中,但我可以将其导出到文本文件中 谢谢。如果数据存储在MySQL中,那么最好在MyS

我需要搜索地址字段,如果有公寓号码,则将一个字符改为大写。所以“521主街3b”将改为“521主街3b”

我知道这样做的方法是编写一个程序,在记录集中循环,查看地址字段中最后一个字符是否是字母,然后如果前面的字符是数字,更改最后一个字符的大小写并更新记录

使用正则表达式(从未使用过)会更快/更简单吗? 如果是这样,最好是在编程环境中完成,还是使用文本编辑器(如Textmate或vi)?数据在MySQL和Excel中,但我可以将其导出到文本文件中


谢谢。

如果数据存储在MySQL中,那么最好在MySQL中进行处理:

UPDATE  addresses
  SET   address = CONCAT(LEFT(address, CHAR_LENGTH(address) - 1), UPPER(RIGHT(address, 1)))
  WHERE address REGEXP BINARY '#[[:digit:]]+[[:lower:]]{1}$'
;
我添加了
BINARY
,因为否则
REGEXP
不区分大小写,但可能需要省略
BINARY
以支持多字节字符串。在这种情况下,将进行多余的更新,但结果无论如何都是正确的


另一个关于SQL Fiddle的例子显示了哪些值受到影响,以及它们是如何受到影响的:

我使用TextMate解决了这个问题,当我开始理解一点正则表达式时,它很简单。(详情请参阅此处)


尽管如此,我还是怀疑sed或awk(我开始尝试)是否是一个更好的工具。Olexa提供的SQL解决方案也可以工作。我只是不知道如何将它应用于整个记录集

我对速度不太在行,但是如果一个记录集只选择最后一个字符作为小写的记录呢?然后运行该集合,使记录集中的最后一个字符
.toUpper
?总数约为8000;4000-6000需要更改。您当然可以使用正则表达式来查找需要更新的行,但是您需要使用其他工具来修改它们。我运行了这个mysql>UPDATE attRegex SET address=CONCAT(左(地址,字符长度(地址)-1),右(地址,1)),其中地址REGEXP二进制“#[:digit:]+[:lower:]{1}$”;查询确定,0行受影响(0.00秒)行匹配:0更改:0警告:0添加了一个SQL Fiddle示例。感谢此代码和漂亮的示例Olexa,但它只影响第一条记录。如何对整个表运行SQL?我是否需要用PHP编写一个程序(例如)并循环遍历记录,或者是否有其他方法使其成为“多行”?更新整个现有列的示例:这是您想要获得的吗?是的!这很好,非常有用。非常感谢你的坚持!在我的示例中,只更新第一条记录,因为只有第一条记录的公寓编号末尾带有小写字母。:)嗨,Olexa,你会尝试在SQL Fiddle上更新2-3条小写记录吗?我编辑了模式,但它只更新了一个。谢谢你的帮助!