我有一个表测试,列名具有整数和非整数值
+------------+
| 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)字段。
答案 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
一些解释:
rlike
是like
^[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