substring_index中的Mysql多个匹配模式

时间:2014-06-24 14:34:16

标签: mysql

我可以使用case之类的内容在substring_index中提供多种匹配模式吗?

更具体地说,在我的情况下,我可以根据他们的ascii匹配一组字符吗?

添加一些例子:

中文Q100
中文T800
中文中文K999

字符串以一些汉字开头,然后是一些数字或拉丁字母,我想要的是将字符串分成两部分:一部分包含汉字(从最左边到第一个西部字母),另一部分是从第一封西方信到最右边。

喜欢这些:

中文, Q100
中文, T800
中文中文, K999

1 个答案:

答案 0 :(得分:2)

有多种方法可以解决问题。从最右边开始,我会给你3个。

架构解决方案

使用应用

你的问题是关于 - 用正则表达式替换。而且MySQL的支持很弱(准确地说,没有人支持用正则表达式替换)。因此,您可以这样做:选择整个记录,然后使用a-zA-Z0-9掩码将其拆分为应用程序。

或者可能会更改表格结构?

嗯,替代方案是:您可能应该将此数据分成2列吗?如果您打算使用单独的数据部分,那么可能是改变数据库架构的标志吗?


使用MySQL

第二种方式是使用MySQL。要做到这一点 - 是的,你会按原样使用REPLACE()。例如,要删除所有字母数字符号,您将执行以下操作:

SELECT [...REPLACE(REPLACE(str, 'z', ''), 'y', '')...]

这是一个伪SQL,因为发布整个26 + 26 + 10个REPLACE实例会很生气(但是,使用它也很疯狂)。但是,这当然会解决你的问题。


使用外部REGEXP解决方案

这是第三种方式,它有两个子类。您可以使用UDF或存储例程。

使用UDF

有第三方库提供正则表达式替换功能。然后,您需要做的就是将这些库包含到您的服务器构建中。示例:lib_mysqludf_preg但是,这将需要其他操作才能使用这些库。

使用存储的例程

好吧,您可以使用存储的例程来创建自己的替换函数。实际上,我已经编写了这样的库,它被称为mysql-regexp并且它提供了REGEXP_REPLACE()函数,它允许您通过正则表达式替换字符串。它没有经过充分测试,所以如果您决定使用它 - 请自行承担风险。样本将是:

mysql> SELECT REGEXP_REPLACE('foo bar34 b103az 98feo', '[^a-z]', '');
+--------------------------------------------------------+
| REGEXP_REPLACE('foo bar34 b103az 98feo', '[^a-z]', '') |
+--------------------------------------------------------+
| foobarbazfeo                                           |
+--------------------------------------------------------+
1 row in set (0.00 sec)

由于它完全用存储的代码编写,因此您无需重新构建服务器或其他任何内容。