我有这样的字段:
-----------------
id | name
-----------------
1 | name123
-----------------
2 | name
-----------------
3 | name456
-----------------
4 | name
我想提取名称中包含数字的行以及包含此类数字的字段
------------------------------
id | name | number
-----------------------------
1 | name123 | 123
-----------------------------
3 | name456 | 456
我们怎样才能找到有数字并将数字提取为新字段的记录?
答案 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来比较名称中的数值...但是名称必须以数字开头...所以我反过来进行计算然后再反转... 注意您的所有姓名都必须以姓名开头,并以数字结尾,以便为所有人提供服务
因为你说有些人可以用数字开头而有些人用数字结尾..然后试试这个
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
答案 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]+$';