Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 有没有办法在存储过程中传递默认整数?_Mysql_Sql_Stored Procedures - Fatal编程技术网

Mysql 有没有办法在存储过程中传递默认整数?

Mysql 有没有办法在存储过程中传递默认整数?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,对于我的家庭作业,存储过程应该接受1到15之间的可选整数,但如果没有传递值,则默认为3 DELIMITER // CREATE OR REPLACE PROCEDURE rankVideos(rank INT) BEGIN if rank = null then SET rank = 3; END if; CREATE OR REPLACE TEMPORARY TABLE all_ranks AS ( SELECT * FROM youtube.ho

对于我的家庭作业,存储过程应该接受1到15之间的可选整数,但如果没有传递值,则默认为3

DELIMITER //
CREATE OR REPLACE PROCEDURE rankVideos(rank INT)
BEGIN
    if rank = null then
        SET rank = 3;
    END if;
    
 CREATE OR REPLACE TEMPORARY TABLE all_ranks AS (
 SELECT * FROM youtube.homework7a
 );

 create OR REPLACE TEMPORARY TABLE t2 AS ( SELECT
 category,
    row_number() OVER (ORDER BY cnt DESC) v_cnt, 
    row_number() OVER (ORDER BY views DESC) v_views,
    row_number() OVER (ORDER BY likes DESC) v_likes,
    row_number() OVER (ORDER BY dislikes DESC) v_dislikes,
    row_number() OVER (ORDER BY comment_count DESC) v_comment_count FROM all_ranks
 );


 CREATE OR REPLACE TEMPORARY TABLE t3 AS (
 SELECT * FROM t2
 WHERE v_cnt <= rank OR v_views <= rank OR v_likes <= rank
 OR v_dislikes < rank OR v_comment_count <= rank
 );


 CREATE OR replace TEMPORARY TABLE t4 AS (
 SELECT category,
 case when v_cnt <= rank then v_cnt ELSE null END cnt,
 case when v_views <= rank then v_views ELSE null END views,
 case when v_likes <= rank then v_likes ELSE null END likes,
 case when v_dislikes <= rank then v_dislikes ELSE null END dislikes,
 case when v_comment_count <= rank then v_comment_count ELSE null END comment_count
 FROM t3
 )
;

SELECT *,
ifnull(cnt,999)
 + ifnull(views,999) 
 + ifnull(likes,999) 
 + ifnull(dislikes,999) 
 +ifnull(comment_count,999) num_non_null_cols,
ifnull(cnt,0)
 + ifnull(views,0)
 + ifnull(likes,0)
 + ifnull(dislikes,0)
 + ifnull(comment_count,0) sum_non_null_cols
FROM t4
ORDER BY num_non_null_cols, sum_non_null_cols;


END
//
DELIMITER ;
当我运行该过程并将整数留空时,我得到一个错误,即它的整数值不正确。

SQL MSSQL

创建proc MyProc @秩int=3 像 ... 去


如果您传入一个值,它将使用该值。如果不传入值,@rank=3。

您显示的语法让我觉得您在使用MySQL或MariaDB

这些实现不支持过程参数默认值的功能。这是MySQL中要求的:但到目前为止,它还不受支持

您正在使用我所知的最佳解决方法,将参数设置为默认值(如果为NULL)

另一种编码方法是使用函数:

SET rank = COALESCE(rank, 3);

这只是实现与IF/THEN代码相同功能的另一种方法。

什么类型的SQL?MS SQL Server?神谕MySQL?if-rank=null应该是if-rank为null。这将其缩小到MariaDB、MySQL、MS-SQL、PostgreSQL和SQLLite。请计算出哪一个并相应地标记。它们的默认参数都有不同的语法。明白了,我相信我使用的是MariaDB。@camjace321作为将来的参考,您通常应该使用MariaDB的mysql标记,它是公共mysql代码的分支。