MySQLで文字列内の文字を数える方法を教えてもらえますか?
例えば:
SELECT numberOfLetters('abc123 def')
6を返します
文字で、私はAZとazを意味します。
numberOfLettersはもちろん有効なSQLではありませんが、私がやろうとしていることを示しています。
私が使用しているMySQLのバージョンは5.5.27です。
MySQLで文字列内の文字を数える方法を教えてもらえますか?
例えば:
SELECT numberOfLetters('abc123 def')
6を返します
文字で、私はAZとazを意味します。
numberOfLettersはもちろん有効なSQLではありませんが、私がやろうとしていることを示しています。
私が使用しているMySQLのバージョンは5.5.27です。
関数が必要になります:
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');
私の頭の上からかなり外れていますが、これで必要なことはできると思います。
注: 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 |
+-------------------------------+
これがMySQLに適しているとは言えませんが、試してみてください-
SELECT CHAR_LENGTH(
REPLACE(
REPLACE(
REPLACE(
REPLACE('abc123 def', ' ', ''), '1', ''), '2', ''), '3', '')
);
...カウントから削除する必要がある文字ごとにREPLACE関数を追加する必要があります。