用MySQL实现输出直接三角形

发布时间:2024年01月17日

题目

P(n) represents a pattern drawn by Julia in R rows. The following pattern represents P(5):
*
* *
* * *
* * * *
* * * * *
Write a query to print the pattern P(20).
翻译过来就是有个P(5)的结果是上面那个样子,让你写个P(20),能够输出对应的图形

思考

1、输入n给P,就会得到图形
2、图形是n行字符串,那么要把字符串连接起来就要使用concat()函数
注:concat(‘str1’,‘str2’,‘str3’,…),将str1,str2,str3…连接起来
3、那么接下来需要输出n个*,这里要使用repeat(str,count)函数
注:repeat(str,count),将str重复count次
4、要一层一层的输出,那么这里就需要牵扯到循环遍历,创建一个变量i,当i<=n时,执行2,3
5、要把以上功能整合在一起,我最先想到的是函数,思考过后,也可以使用存储过程来实现

SQL循环有以下几种

1、while

while 条件 do
SQL语句;
end while;

2、repeat

repeat
sql;
until 条件;
end repeat;

3、loop

leave:配合循环,退出循环
iterate:跳过当前循环,直接进入下一次循环
[begin_label:]loop
SQL
end loop[end_label];
注:使用loop要注意必须要使用leave,否则loop会无线循环

这里我选择的是while循环,理由是简单,好理解

函数实现

DELIMITER //
CREATE FUNCTION fun1 ( idx INT ) RETURNS VARCHAR(255) DETERMINISTIC
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE	l1 VARCHAR(255) DEFAULT '';# 声明定义1个变量, 初值默认为 null
	declare l2 VARCHAR(255) DEFAULT '';
	while idx>=i do
		set l1 = REPEAT('* ',i);
		repe
		set l2 = CONCAT(l2,l1,'\n');
		set i = i+1;
	end while;
		
RETURN l2 ;
END //
DELIMITER ;

SELECT fun1(20)

注:如果MySQL配置中启用了二进制日志记录(binary logging),而函数声明中没有指定函数的属性,导致MySQL无法确定函数是否是确定性的(deterministic)。为了解决这个问题,我在函数声明中添加 DETERMINISTIC 关键字,表示函数是确定性的。否则函数会报错:

1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

存储过程实现

DELIMITER //

CREATE PROCEDURE drawP(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE pattern VARCHAR(255) DEFAULT '';
    DECLARE result VARCHAR(255) DEFAULT '';
    
    WHILE i <= n DO
        SET pattern = REPEAT('* ', i);
        SET result = CONCAT(result, pattern, '\n');
        SET i = i + 1;
    END WHILE;
    
    SELECT result;
END //

DELIMITER ;
CALL drawP(20);

loop函数实现

DELIMITER $$ 
CREATE PROCEDURE pattern()
 BEGIN
DECLARE pat TEXT;
DECLARE num INT;
    SET num = 0;
    SET pat = "";
    looper: LOOP
        SET num = num + 1;
        SET pat = CONCAT(pat, "* ");
        SELECT pat;
        IF num = 20 THEN
            LEAVE looper;
        END IF;
    END LOOP looper;
END $$   
DELIMITER ;
CALL pattern();

注0:loop函数必须使用leave loop函数名
注1:此函数的执行结果是n个结果,第几个结果就有几个*,while和存储函数都是链接在一起是一个输出结果
注2:此函数没有使用repeat函数,而是巧妙的使用了concat函数,每次都多链接一个‘*_’

文章来源:https://blog.csdn.net/weixin_41576727/article/details/135598840
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。