如何从mysql中的字段中提取部分文本?

时间:2014-10-22 16:47:08

标签: mysql regex regexp-substr

我有这样的字段:

-----------------
   id    |  name  
-----------------
   1     |  name123  
-----------------
   2     |  name  
-----------------
   3     |  name456  
-----------------
   4     |  name  

我想提取名称中包含数字的行以及包含此类数字的字段

------------------------------
   id    |  name     | number
-----------------------------
   1     |  name123  |  123
-----------------------------
   3     |  name456  |  456

我们怎样才能找到有数字并将数字提取为新字段的记录?

3 个答案:

答案 0 :(得分:3)

你可以在int上使用MySQL的字符串转换来删除像这样的名称

SELECT 
    t.id, 
    t.name, 
    REVERSE(REVERSE(t.name)+ 0) AS num,
    REPLACE(t.name,REVERSE(REVERSE(t.name)+ 0),'') AS actualname
FROM foobar t
HAVING num <> 0

这个技巧是通过添加一个0 mysql来比较名称中的数值...但是名称必须以数字开头...所以我反过来进行计算然后再反转... 注意您的所有姓名都必须以姓名开头,并以数字结尾,以便为所有人提供服务

FIDDLE DEMO


编辑:

因为你说有些人可以用数字开头而有些人用数字结尾..然后试试这个

SELECT 
    t.id, 
    t.name, 
    REVERSE(REVERSE(t.name)+ 0) AS num,
    REPLACE(t.name,REVERSE(REVERSE(t.name)+ 0),'') AS actualname
FROM foobar t
HAVING num <> 0
UNION ALL
SELECT 
    t.id, 
    t.name, 
    t.name + 0 AS num,
    REPLACE(t.name,t.name + 0,'') AS actualname
FROM foobar t
HAVING num <> 0

ANOTHER DEMO

答案 1 :(得分:3)

这是另一种处理mysql的方法

SELECT 
  id,
  name,
  SUBSTRING( 
    name,LEAST (
      if (Locate('0',name) >0,Locate('0',name),999),
      if (Locate('1',name) >0,Locate('1',name),999),
      if (Locate('2',name) >0,Locate('2',name),999),
      if (Locate('3',name) >0,Locate('3',name),999),
      if (Locate('4',name) >0,Locate('4',name),999),
      if (Locate('5',name) >0,Locate('5',name),999),
      if (Locate('6',name) >0,Locate('6',name),999),
      if (Locate('7',name) >0,Locate('7',name),999),
      if (Locate('8',name) >0,Locate('8',name),999),
      if (Locate('9',name) >0,Locate('9',name),999)
    ),LENGTH(name)
  ) as number
from users 
having number <> '' ;

答案 2 :(得分:0)

另一种方式,假设您想要的数字位于字符串的末尾。 REVERSE()将数字部分放在前面,然后CONVERT()使其成为一个数字并剥离文本,然后再次REVERSE()WHERE名称以数字结尾。感觉就像一个kludge:

select id, name, reverse(convert(reverse(name),signed ))
from tbl
where name REGEXP '[0-9]+$';  

SQL Fiddle Example