2

次のようなフィールドがあります。

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

名前に数字が含まれる行と、このような数字を含むフィールドを抽出したい

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

数字を持つレコードを見つけて、数字を新しいフィールドとして抽出するにはどうすればよいでしょうか?

4

3 に答える 3

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 を追加することですあなたの名前は名前で始まり数字で終わる必要があります。

フィドルのデモ


編集:

数字で始まるものもあれば数字で終わるものもあると言うので、これを試してください

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

別のデモ

于 2014-10-22T17:14:54.480 に答える
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 <> '' ;
于 2014-10-22T17:19:59.260 に答える
0

別の方法として、必要な番号が文字列の末尾にあると仮定します。REVERSE() を使用して数字の部分を前に置き、次に CONVERT() を使用して数字にしてテキストを削除し、次に REVERSE() をもう一度 WHERE 名前が数字で終わるようにします。しかし、クラッジのように感じます:

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

SQL フィドルの例

于 2014-11-28T18:59:32.467 に答える