【问题标题】:Get count of zeros in an integer using MySQL使用 MySQL 获取整数中的零计数
【发布时间】:2020-04-27 02:51:04
【问题描述】:

假设我在 MySQL (10090) 中有一个整数值。我需要计算该数字中所有出现的零位。所以对于前一种情况,它会返回 3:

select count_zeros(number) from dual;
-- when number = 10090, it return 3
-- when number = 10000, it return 4

如何使用 MySQL 查询以最快的方式做到这一点?

【问题讨论】:

  • SELECT LENGTH('10010') x , LENGTH(REPLACE('10010','0','')) y, LENGTH('10010')-LENGTH(REPLACE('10010','0','')) z;

标签: mysql


【解决方案1】:

您可以比较字符串长度是否包含您要计算的字符。

使用LENGTH的解决方案

-- 0 in 10090: 3
-- 0 in 10000: 4
SELECT 
   (LENGTH(number) - LENGTH(REPLACE(number, '0', ''))) AS char_count
FROM dual;

更好更安全的解决方案是使用CHAR_LENGTH 函数而不是LENGTH 函数。使用CHAR_LENGTH 函数,您还可以计算多字节字符(如§)。

使用CHAR_LENGTH的解决方案

-- § in 100§0: 1
SELECT 
    (CHAR_LENGTH(number) - CHAR_LENGTH(REPLACE(number, '§', ''))) AS char_count
FROM dual;

您还可以扩展上述解决方案以计算使用多个字符的字符串值。

-- 12 in 10120012: 2
SELECT number,
  FLOOR((CHAR_LENGTH(number) - CHAR_LENGTH(REPLACE(number, '12', ''))) / CHAR_LENGTH('12')) AS str_count
FROM dual;

demo on dbfiddle.uk


在 MySQL 上,您可以create a function 以更简单的方式使用上述逻辑:

CREATE FUNCTION GetStringCount(strValue VARCHAR(255), strSearchValue VARCHAR(255))
RETURNS INT DETERMINISTIC NO SQL
RETURN FLOOR((CHAR_LENGTH(strValue) - CHAR_LENGTH(REPLACE(strValue, strSearchValue, ''))) / CHAR_LENGTH(strSearchValue));

你可以像这样使用GetStringCount这个新功能:

-- example to count non-multi-byte character (here 0).
-- 0 in 10090: 3
-- 0 in 10000: 4
SELECT number, GetStringCount(number, '0') AS strCount
FROM dual;

-- example to count multi-byte character (here §).
-- § in 100§0: 1
SELECT number, GetStringCount(number, '§') AS strCount
FROM dual;

-- example to count a string with multiple characters.
-- 12 in 10120012: 2
SELECT number, GetStringCount(number, '12') AS strCount
FROM dual;

【讨论】:

  • 如果他需要计算 10120012 中的 12 会返回什么?
【解决方案2】:

我认为首先要做的是将这些整数值转换为字符串。

https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast

然后找到某个字符的出现

https://lists.mysql.com/mysql/215049

mysql> create table numbers(x int);
Query OK, 0 rows affected (0,38 sec)
mysql> select * from numbers;
+-----------+
| x         |
+-----------+
|    123000 |
|      1300 |
|    135600 |
| 135623400 |
|     13560 |
|    135160 |
|  13514560 |
|   1351120 |
|  13512310 |
+-----------+
9 rows in set (0,00 sec)

找到零的出现

mysql> select x, round((length(cast(x as char(11))) - length( replace( cast( x as char(11) ), "0", "" ) ))/length("0")) as str_x from numbers limit 5;
+-----------+-------+
| x         | str_x |
+-----------+-------+
|    123000 |     3 |
|      1300 |     2 |
|    135600 |     2 |
| 135623400 |     2 |
|     13560 |     1 |
+-----------+-------+
5 rows in set (0,00 sec)

找到十三个

mysql> select x, round((length(cast(x as char(11))) - length( replace( cast( x as char(11) ), "13", "" ) ))/length("13")) as str_x from numbers;
+-----------+-------+
| x         | str_x |
+-----------+-------+
|    123000 |     0 |
|      1300 |     1 |
|    135600 |     1 |
| 135623400 |     1 |
|     13560 |     1 |
|    135160 |     1 |
|  13514560 |     1 |
|   1351120 |     1 |
|  13512310 |     1 |
| 132134534 |     2 |
+-----------+-------+
10 rows in set (0,00 sec)

mysql> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2023-04-02
    相关资源
    最近更新 更多