2010-07-05 57 views
2

我在存储的人一样的唯一递增的数字串的组合名称的MySQL表列,所以我必须存储为这样的名字:去掉数字/从MySQL字符串列数字字符

Patrick, Patrick1, Patrick2, ..... Patrick10, David, David2, .... David5 

我如何检索只有字母名称本身,没有数字?假设我想按不同的名称进行分组,并按每组进行计数,所以我得到类似以下的结果。

name | frequency 
----------------- 
Patrick | 10 
David | 5 

回答

1

一个解决办法是这样的:(它看起来并不好,但它的工作原理)

SELECT 
    TRIM(TRAILING '0' FROM 
    TRIM(TRAILING '1' FROM 
     TRIM(TRAILING '2' FROM 
     TRIM(TRAILING '3' FROM 
      -- ... 
      TRIM(TRAILING '8' FROM 
       TRIM(TRAILING '9' FROM name)))))) AS name 
FROM your_table 

然后你可以用GROUP BY从结果中进行选择:

SELECT name, count(*) AS frequency FROM (
-- previous select 
) AS t 
GROUP BY name 
+0

只要数字没有达到21就可以。 – 2010-07-05 10:32:26

+0

'Patrick10'也失败了。 – 2010-07-22 19:39:18

+0

哎呀!然后这些数字应该被替换为一个,然后使用TRIM。 – 2010-07-22 19:48:28

0

我会稍微想一想,但我会建议如果您需要一个可区分的数字,您将它保留在不同的列中。这样,你就不会遇到这种困难。

+0

我不是维护该表,并且我无法访问填充列的代码,因此我的请求 – Olaseni 2010-07-05 08:20:56

+1

您对Olaseni表示我最深切的同情。 – 2010-07-05 08:49:29

0

你可以使用udf

,然后尝试像follwing

select REGEX_REPLACE(name, [0-9], '') as Name, Count(Name) 
     from tableName 
     Group by Name 
+0

没有为我工作 – Olaseni 2010-07-05 08:40:08

+0

我认为这是Oracle和PostgreSQL;我无法在MySQL手册中找到它。 – 2010-07-05 08:53:32

+0

REGEXP_REPLACE的MySQL版本可以从https://launchpad.net/mysql-udf-regexp以UDF形式获得 – 2010-07-05 10:29:16

0

你可以在“链”替换命令是这样的(这将删除数字0,1,2查询)。您可以扩展这些其他数字,但我不知道这将在大型数据集上表现如何:

select replace(replace(replace(Name,“0”,“”),“1”, “”),“2”,“”);

我也会想,做Brian的建议会更好。

+0

如何确保只删除附加数字? – Olaseni 2010-07-05 08:57:27

+0

我正要说,沃尔克已经破解了它。我想你必须创建自己的存储函数来处理名称。如果您需要它,请参阅MySQL参考手册12.1.15中的更多信息。 – 2010-07-05 09:04:00