在mysql的单行中显示数字和非数字列值的计数

时间:2014-08-20 07:37:04

标签: mysql sql

我有一个表测试,列名具有整数和非整数值

+------------+
| names      |
+------------+
| 123        |
| 123abc     |
| 89         |
| dkkjdk     |
| dkdn       |
+------------+

我想在一行中显示整数和非整数值的计数,如

integer_count non_integer_count
2               3

我尝试使用此查询打印整数值

select cast(names as signed) as int_val from test;

但我得到了这个结果

+---------+
| int_val |
+---------+
|     123 |
|     123 |
|      89 |
|       0 |
|       0 |
+---------+

name字段是varchar(20)字段。

3 个答案:

答案 0 :(得分:5)

这是解决方案

SELECT COUNT(CASE WHEN not names REGEXP '^[0-9]+$' THEN 1 END) AS ALPHA, COUNT(CASE WHEN names REGEXP '^[0-9]+$' THEN 1 END) AS DIGIT FROM test;

输出

+-------+-------+
| ALPHA | DIGIT |
+-------+-------+
|     3 |     2 |
+-------+-------+

答案 1 :(得分:1)

使用基于正则表达式的条件总和:

select
    sum(names rlike '^[0-9]+$') integer_count,
    sum(names not rlike '^[0-9]+$') non_integer_count
from test

请参阅SQLFiddle

一些解释:

  • rlikelike
  • 的正则表达式版本
  • 正则表达式^[0-9]+$匹配,如果整个值是一个或多个数字。请注意^$,如果没有它,它会测试值
  • 中的数字
  • 使用sum(condition)计算条件为真的次数,因为(在mysql中)true为1而false为0

答案 2 :(得分:0)

您可以使用10次调用replace来获取没有数字的名称。然后,您可以通过比较名称的长度和没有数字的名称来计算位数:

select  names
,       length(names) - length(non_digit) as digit_chars
,       length(non_digit) as non_digit_chars
from    (
        select  replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
                    names, '0', ''),
                    '1', ''),
                    '2', ''),
                    '3', ''),
                    '4', ''),
                    '5', ''),
                    '6', ''),
                    '7', ''),
                    '8', ''),
                    '9', '') as non_digit
        ,       names
        from    YourTable
        ) as SubQueryAlias

Example at SQL Fiddle.