查询将字符串中的5个数字字符复制到MySQL

时间:2015-10-12 13:15:07

标签: mysql

在我的数据库的特定列中,我有很多字符串,如

sometext sometext 12345 some more text 33 
some 12345 text then some random characters 12-13
text text text 3 text

现在我正在寻找一种方法将5个数字字符集复制到一个单独的列中。我已经用

缩小了我的选择范围
SELECT * FROM mytable WHERE mycolumn REGEXP '[0-9]{5}'

但这并不能隔离5个数字字符。有没有办法可以复制5个数字字符(如果存在),如果不存在则为NULL(如第三行)?

2 个答案:

答案 0 :(得分:1)

表:

CREATE TABLE table2 (`text` varchar(49));

INSERT INTO table2 (`text`)
VALUES
    ('sometext sometext 12345 some more text 33'),
    ('some 12345 text then some random characters 12-13'),
    ('text text text 3 text');

查询:

select
t.text,
substring_index(substring_index(t.text, ' ', n.number), ' ', -1) as 'extracted_number'
from
table2 as t,
(select 1 as 'number' union select 2 union select 3 union select 4 union select 5 union select 6  union select 7 union select 8)  as n
where 
t.text REGEXP '[0-9]{5}'
and substring_index(substring_index(t.text, ' ', n.number), ' ', -1) REGEXP '^[0-9]{5}$'

输出:

text                                                extracted_number
some 12345 text then some random characters 12-13   12345
sometext sometext 12345 some more text 33           12345

您可以将select 1 as 'number' union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8替换为带有数字的表格。最大数字应该等于一行中的最大字数。

如果您可以使用MariaDB而不是MySQL,那么您可以使用sequence来补充数字表甚至使用 REGEXP_INSTR(需要MariaDB 10.0.5或更高版本)而不是字符串函数。

更新:

以上查询将从给定文本中提取所有 5位数字 - 而不仅仅是第一个。

答案 1 :(得分:0)

MySQL仅支持REGEX过滤结果。它不会让你像其他一些字符串函数一样操作字符串(即CONCAT)要从字符串中获取数字,你必须使用其他一些你喜欢的语言,它支持正则表达式字符串操作和MySQL连接(即PHP,Java) ,Python等)然后用你已经获得的值插入它们。当然,您可以使用已有的查询来缩小要使用的记录数量:

/\[Ticket-ID: (\S+)\]\s*(.*)/