5

谁能告诉我如何在 MySQL 中计算字符串中的字母?

例如:

SELECT numberOfLetters('abc123 def')

将返回 6

通过字母,我的意思是 AZ 和 az。

numberOfLetters 当然不是有效的 SQL,但它说明了我正在尝试做的事情。

我使用的 MySQL 版本是 5.5.27

4

4 回答 4

3

您将需要一个功能:

DROP FUNCTION IF EXISTS numberOfLetters;

DELIMITER //

CREATE FUNCTION numberOfLetters(s VARCHAR(255)) RETURNS INT DETERMINISTIC NO SQL
BEGIN
    DECLARE c INT;
    DECLARE r INT DEFAULT 0;
    DECLARE n INT DEFAULT LENGTH(s);
    DECLARE i INT DEFAULT 1;

    WHILE i <= n DO
        SET c = ASCII(SUBSTRING(s, i, 1));
        IF (c >= 65 AND c <= 90) OR (c >= 97 AND c <= 122) THEN
            SET r = r + 1;
        END IF;
        SET i = i + 1;
    END WHILE;

    RETURN r;
END//

DELIMITER ;

然后调用:

SELECT numberOfLetters('abc123 def');
于 2012-11-20T07:46:06.407 回答
1

相当离我的头,但我相信这会做你需要的。

注意:假设 ASCII 并且您只计算 az、AZ。

DROP FUNCTION IF EXISTS numberOfLetters;
DELIMITER //
CREATE FUNCTION numberOfLetters (inStr CHAR(255))
RETURNS INT
BEGIN
    DECLARE strLen INT;
    DECLARE letterCt INT;
    DECLARE pos INT;
    DECLARE curLetter CHAR(1);

    SET pos      := 0;
    SET letterCt := 0;

    SELECT LENGTH(inStr) INTO strLen;

    ctLoop: LOOP
        IF (strLen = 0) THEN
            LEAVE ctLoop;
        END IF;

        SELECT SUBSTR(inStr, strLen, 1) INTO curLetter;
        IF (ASCII(curLetter) >= 65 AND ASCII(curLetter) <= 90) OR (ASCII(curLetter) >= 97 AND ASCII(curLetter) <= 122) THEN
            SET letterCt := letterCt + 1;
        END IF;

        SET strLen := strLen - 1;
    END LOOP ctLoop;

    RETURN letterCt;
END //
DELIMITER ;

select numberOfLetters('abc123 def');

输出:

+-------------------------------+
| numberOfLetters('abc123 def') |
+-------------------------------+
|                             6 |
+-------------------------------+
于 2012-11-20T07:47:12.920 回答
1

您可以像这样简单地使用length()函数:


选择长度('abc123 def');

它返回: 10

于 2014-03-12T13:03:15.087 回答
0

我不能说这对 MySQL 有好处,但请尝试一下 -

SELECT CHAR_LENGTH(
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE('abc123 def', ' ', ''), '1', ''), '2', ''), '3', '')
);

...您应该为需要从计数中删除的每个字符添加 REPLACE 函数。

于 2012-11-20T06:57:33.893 回答