我尝试在MySQL上重新创建一个SQL服务器函数。函数应该能够返回一个在大写字母之前有空格的字符串。例如,写"HelloWorld"会返回"Hello World"。
其他示例:
"伊恩喜欢简"->"伊恩喜欢珍"
"CodLiverOil"->"Cod Liver Oil"
我的逻辑如下
result string = ''
Foreach character in input string:
If this letter is capital:
If the preceding or next letter is not capital:
If the the preceding and current letter is not a space:
Concatinate space after result string
Concatinate this letter with result
MySQL:
DELIMITER $$
CREATE FUNCTION SpaceBeforeCapital (str NVARCHAR(8000))
RETURNS NVARCHAR(8000)
DETERMINISTIC
BEGIN
DECLARE i INT;
DECLARE j INT;
DECLARE cp NCHAR;
DECLARE c0 NCHAR;
DECLARE c1 NCHAR;
DECLARE result NVARCHAR(8000);
SET i = 1;
SET j = CHAR_LENGTH(str);
SET result = '';
WHILE (i <= j) DO
SET cp = SUBSTRING(str,(i-1),1);
SET c0 = SUBSTRING(str,i,1);
SET c1 = SUBSTRING(str,(i+1),1);
-- IF c0 = UPPER(c0) THEN
-- IF c0 = UPPER(CONVERT(c0 USING latin1)) AND (cp != UPPER(CONVERT(cp USING latin1)) OR c1 != UPPER(CONVERT(c1 USING latin1)))
IF c0 = UPPER(CONVERT(c0 USING latin1)) THEN
IF cp != UPPER(CONVERT(cp USING latin1)) OR c1 != UPPER(CONVERT(c1 USING latin1)) THEN
IF cp != ' ' AND c0 != ' ' THEN
SET result = CONCAT(result,' ');
END IF;
END IF;
END IF;
-- END IF;
SET result = CONCAT(result,c0);
SET i = i + 1;
END WHILE;
RETURN result;
END$$
DELIMITER;
我的脚本在很大程度上与没有空格的输入字符串相反。有人能搞定吗?
我认为这里的问题是区分大小写并没有像您希望的那样工作。
尝试用BINARY UPPER
替换UPPER
以强制区分大小写。因此:
DELIMITER $$
CREATE FUNCTION SpaceBeforeCapital (str NVARCHAR(8000))
RETURNS NVARCHAR(8000)
DETERMINISTIC
BEGIN
DECLARE i INT;
DECLARE j INT;
DECLARE cp NCHAR;
DECLARE c0 NCHAR;
DECLARE c1 NCHAR;
DECLARE result NVARCHAR(8000);
SET i = 1;
SET j = CHAR_LENGTH(str);
SET result = '';
WHILE (i <= j) DO
SET cp = SUBSTRING(str,(i-1),1);
SET c0 = SUBSTRING(str,i,1);
SET c1 = SUBSTRING(str,(i+1),1);
-- IF c0 = UPPER(c0) THEN
-- IF c0 = UPPER(CONVERT(c0 USING latin1)) AND (cp != UPPER(CONVERT(cp USING latin1)) OR c1 != UPPER(CONVERT(c1 USING latin1)))
IF c0 = BINARY UPPER(CONVERT(c0 USING latin1)) THEN
IF cp != BINARY UPPER(CONVERT(cp USING latin1)) OR c1 != BINARY UPPER(CONVERT(c1 USING latin1)) THEN
IF cp != ' ' AND c0 != ' ' THEN
SET result = CONCAT(result,' ');
END IF;
END IF;
END IF;
-- END IF;
SET result = CONCAT(result,c0);
SET i = i + 1;
END WHILE;
RETURN result;
END$$
DELIMITER ;
如果其他人仍然没有运气,我有以下两个建议。。。试着只使用UPPER()而不使用converter/Latin1…因为你已经有一个字符要处理了。
IF c0 = UPPER(c0) THEN
与上()转换测试的其余部分相同
如果这不起作用,我会在函数的开头构建一个字符串,比如
DECLARE AllUpper NVARCHAR(26);
SET AllUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
然后使用INSTR()查看该字符是否在所有上字符串中
IF INSTR( AllUpper, c0 ) > 0
类似于上转换测试