MYSQL8 创建自定义函数 首字母拼音

14 篇文章 0 订阅

话不多说,直接上代码:

# 解决报错:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
set global log_bin_trust_function_creators=TRUE;

# 加上这句防止重复定义函数
# DROP FUNCTION IF EXISTS `firstPinyin`;

DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `firstPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci
begin
	DECLARE V_RETURN VARCHAR(255);
	DECLARE V_BOOL INT DEFAULT 0;
	DECLARE FIRST_VARCHAR VARCHAR(1);
	DECLARE V_NUMBER INT DEFAULT 0;
	DECLARE V_OUTWORD VARCHAR(255) DEFAULT NULL;

	SET FIRST_VARCHAR = left(CONVERT(P_NAME USING gbk),1); 
	
	SELECT `py` FROM `t_pinyin` WHERE `zi`=FIRST_VARCHAR INTO V_OUTWORD;
	
	IF V_OUTWORD IS NOT NULL OR V_OUTWORD <> "" THEN 
		SET V_RETURN = UPPER(LEFT(V_OUTWORD, 1));
	ELSE

		SELECT FIRST_VARCHAR REGEXP '[0-9]' INTO V_NUMBER;
	
		IF V_NUMBER = 1 THEN
	
			SET V_RETURN = ELT(FIRST_VARCHAR + 1, 'L','Y','E','S','S','W','L','Q','B','J');
		ELSE
			SELECT FIRST_VARCHAR REGEXP '[a-zA-Z]' INTO V_BOOL;
			IF V_BOOL = 1 THEN
				SET V_RETURN = UPPER(FIRST_VARCHAR);
			ELSE
				SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
			END IF;
		END IF;
	END IF;
	return V_RETURN;
	#return date_format(mydate,'%Y-%m');         -- 函数需要返回值,return返回相应的处理结果
end$$
DELIMITER ;

知识点:

1、ELT(N, string1, string2, string3, string4, …)

参数:
该方法接受上面提到的和下面描述的两个参数。

  • N:它是一个整数,是要检索的字符串的索引。
  • 字符串1,字符串2,字符串3:我们要从中检索的字符串列表。

返回-
它在指定的索引处返回一个字符串。如果指定的索引N处没有字符串,则返回NULL。

例子:

Select ELT(4, 'Learning', 'SQL', 'at', 'geeksforgeeks', 'is', 'fun') 
As Res_Str;

上面语句输出:geeksforgeeks

2、INTERVAL(N,N1,N2,N3,…)

其中,N是要判断的数值,N1,N2,N3,…是分段的间隔。

这个函数的返回值是段的位置:

如果N<N1,则返回0,

如果N1<=N<N2,则返回1,

如果N2<=N<N3,则返回2。

所以,区间是前闭后开的。

3、LEFT(str,length);

  • str是要提取子字符串的字符串。
  • length是一个正整数,指定将从左边返回的字符数。

LEFT()函数返回str字符串中最左边的长度字符。如果strlength参数为NULL,则返回NULL值。

4、CONVERT(s USING cs)

函数将字符串 s 的字符集变成 cs。

例如:

SELECT CHARSET(CONVERT('ABC' USING gbk))

5、UPPER(s)

将字符串转换为大写。

例如:

将字符串 runoob 转换为大写:

SELECT UPPER("runoob"); -- RUNOOB

6、CONV(x,f1,f2)

返回 f1 进制数变成 f2 进制数

例如:SELECT CONV(15, 10, 2);  -> 1111

7、Hex(str)

将指定内容(str)转换为16进制,这个str可以是数值或字符串。

以上用到一个生僻汉字拼音表,解决生僻汉字拼音转换错误的问题,表格资源地址:生僻汉字拼音表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,你可以创建自定义函数来满足特定的需求。MySQL不仅有着自己定义好的函数,数据库管理员也可以根据需求来定义自己的函数。 要创建自定义函数,你可以使用CREATE FUNCTION语句。它的语法如下: ``` CREATE FUNCTION <函数名>(<参数列表>) RETURNS <返回值类型> [特性...] BEGIN 函数体 END ``` 其中,函数名是你要创建的函数的名称,参数列表是函数的参数,返回值类型是函数的返回值类型。函数体用于编写函数的逻辑代码。 举个例子,假设我们要创建一个函数来计算两个数字的和,可以这样写: ``` CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT BEGIN DECLARE result INT; SET result = a + b; RETURN result; END ``` 以上代码创建了一个名为add_numbers的函数,它接受两个整数参数a和b,并返回它们的和。函数体中使用DECLARE语句声明了一个变量result,并使用SET语句将计算结果赋给result变量,最后使用RETURN语句返回结果。 创建完成后,你可以使用SELECT语句调用自定义函数,例如: ``` SELECT add_numbers(2, 3); ``` 这将返回5,即两个数字的和。 要注意的是,如果你想删除已经创建自定义函数,可以使用DROP FUNCTION语句。例如: ``` DROP FUNCTION IF EXISTS <函数名>; ``` 其中,函数名是你要删除的函数的名称。 总结来说,你可以使用CREATE FUNCTION语句来创建自定义函数,在函数体中编写你所需的逻辑代码。使用SELECT语句调用自定义函数来获取结果。如果需要删除已经创建自定义函数,可以使用DROP FUNCTION语句。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL中如何定义一个自己写的函数](https://blog.csdn.net/weixin_45970271/article/details/124212377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值