在我的数据库的特定列中,我有很多字符串,如
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(如第三行)?
答案 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*(.*)/