作者:mobiledu2502913567 | 来源:互联网 | 2023-09-15 12:21
我试图在MySQL中仅使字符串的奇数索引为大写(而偶数索引为小写)。
例如:StackOverflow-> StAcKoVeRfLoW或hello-> HeLlO。
我找到了一种方法,方法是使用mid函数一次提取一个字母,然后根据该字母位于哪个索引进行连接:
SET @x='hello';
SELECT @x as Initial,concat(ucase(mid(@x,1,1)),lcase(mid(@x,2,ucase(mid(@x,3,4,5,1)))
as Final;
但是,我对是否有一种简化方法感兴趣,因为如果字符串较大,那么我们将遇到一些问题。因此,基本上有一种方法可以将其修改为:
concat(ucase(mid(@x,odd index,even index,1)))?
这可能是最简单的在您的应用程序中完成的操作,但是可以在MySQL中实现。对于MySQL 8+,您可以使用递归CTE从字符串中提取各个字母,然后使用GROUP_CONCAT
将它们放回去,从而交替改变大小写:
WITH RECURSIVE INITIAL AS (
SELECT 'StackOverflow' AS x
),CTE AS (
SELECT 1 AS upper,SUBSTRING(x,1,1) AS letter,2) AS remainder
FROM INITIAL
UNION ALL
SELECT 1 - upper,SUBSTRING(remainder,1),2)
FROM CTE
WHERE LENGTH(remainder) > 0
)
SELECT GROUP_CONCAT(CASE WHEN upper THEN UPPER(letter) ELSE LOWER(letter) END SEPARATOR '') AS new
FROM CTE
输出:
StAcKoVeRfLoW
在低于8的版本中,您可以使用用户定义的函数:
DELIMITER //
CREATE FUNCTION AlterCase(initial TEXT)
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE l CHAR(1);
DECLARE new TEXT DEFAULT '';
WHILE i <= LENGTH(initial) DO
SET l = SUBSTRING(initial,i,1);
SET new = CONCAT(new,CASE WHEN i % 2 = 1 THEN UPPER(l) ELSE LOWER(l) END);
SET i = i + 1;
END WHILE;
RETURN new;
END //
DELIMITER ;
并命名为
SELECT AlterCase('StackOverflow')
输出:
StAcKoVeRfLoW
请注意,该功能也将在MySQL 8+中运行。
Demo on dbfiddle