有谁能告诉我如何计算MySQL中字符串中的字母?
例如:
SELECT numberOfLetters('abc123 def')
将返回6
通过信件,我指的是A-Z和a-z。
numberOfLetters当然不是有效的SQL,但它说明了我想要做的事情。
我正在使用的MySQL版本是5.5.27
答案 0 :(得分:2)
您需要一个功能:
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');
答案 1 :(得分:1)
相当于我的头脑,但我相信这会做你需要的。
注意:假设ASCII并且您只计算a-z,A-Z。
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 |
+-------------------------------+
答案 2 :(得分:1)
您只需使用 length()功能:
选择长度(&#39; abc123 def&#39;);
它返回: 10
答案 3 :(得分:0)
我不能说这对MySQL有好处,但只是尝试一下 -
SELECT CHAR_LENGTH(
REPLACE(
REPLACE(
REPLACE(
REPLACE('abc123 def', ' ', ''), '1', ''), '2', ''), '3', '')
);
...你应该为你需要从计数中删除的每个字符添加REPLACE函数。