繁体   English   中英

substring_index中的Mysql多个加工模式

[英]Mysql multiple maching patterns in substring_index

我可以使用case东西在substring_index给出多个匹配模式吗?

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

添加一些示例:

中文Q100
中文T800
中文中文K999

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

像这些:

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

有多种方法可以解决问题。 从最右边开始,我会给你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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM