gpt4 book ai didi

mysql - 如何在 MySQL 中仅将字符串的奇数索引设为大写?

转载 作者:行者123 更新时间:2023-11-29 09:30:09 26 4
gpt4 key购买 nike

我试图在 MySQL 中仅将字符串的奇数索引设为大写(而偶数索引设为小写)。

例如:StackOverflow -> StAcKoVeRfLoW 或 hello -> HeLlO。

我找到了一种方法,通过使用 mid 函数一次提取一个字母,然后根据该字母所在的索引进行连接:

SET @x='hello';
SELECT @x as Initial,
Concat(ucase(mid(@x,1,1)),lcase(mid(@x,2,1)),ucase(mid(@x,3,1)),lcase(mid(@x,4,1)),ucase(mid(@x,5,1)))
as Final;

但是我很感兴趣是否有一种方法可以简化这个过程,因为如果字符串更大,那么我们就会遇到一些问题。所以基本上有没有办法将其修改为:

Concat(ucase(mid(@x,odd index,1)),lcase(mid(@x,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, SUBSTRING(x, 2) AS remainder
FROM INITIAL
UNION ALL
SELECT 1 - upper, SUBSTRING(remainder, 1, 1), SUBSTRING(remainder, 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

关于mysql - 如何在 MySQL 中仅将字符串的奇数索引设为大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58896423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com