【问题标题】:MySql procedure IF number is odd or evenMySql过程IF数是奇数还是偶数
【发布时间】:2014-12-11 20:00:27
【问题描述】:

我学习mysql和我的问题是在这里检查我做错了什么:

我正在尝试创建一个 sql 程序来检查用户输入的数字的 first numberodd 还是 even 但我在 ';//'

附近的第 9 行出现语法错误

这是 sql:

MYSQL>
DELIMITER //

CREATE PROCEDURE num()
BEGIN
IF (SELECT LEFT(num,1))=1 OR (SELECT LEFT(num,1))=3 OR (SELECT LEFT(num,1))=5 OR (SELECT LEFT(num,1))=7 THEN
SELECT 'number is odd';
ELSEIF (SELECT LEFT(num,1))=2 OR (SELECT LEFT(num,1))=4 OR (SELECT LEFT(num,1))=6 OR (SELECT LEFT(num,1))=8 THEN
SELECT 'number is even'; 
END IF;

END;//

这是用于测试的当时号码的呼叫:

MYSQL> CALL num(3123123123) 

有什么想法吗?

【问题讨论】:

  • SELECT IF(LEFT(number,1) & 1,'number is odd','number is even');
  • mysqltutorial.org/stored-procedures-parameters.aspx。首先,在您的 if 语句中, Num 在哪里传递?执行 call num (3123123123) 时的参数/变量在哪里
  • 我还是新手,所以我还不知道它是如何工作的

标签: mysql if-statement procedure


【解决方案1】:

您要做的是计算。 % 2 将给出除以 2 的余数。如果余数不为 0,则为奇数

SELECT IF(LEFT(num, 1) % 2 <> 0, "number is odd", "number is even")

你还想把你的程序改成这样

DELIMITER //
CREATE PROCEDURE `num`( IN input_num int, OUT output varchar(200))
    BEGIN
        SELECT IF(LEFT(input_num, 1) % 2 <> 0, "number is odd", "number is even") INTO output;
    END//

你会这样称呼它。

set @a = '';
call num(333, @a);

select @a;

demo fiddle

【讨论】:

  • 我喜欢你的逻辑。现在我想弄清楚如何把它变成一个程序。
  • @User_T 我的答案有一个过程以及如何使用它试试看:)
  • 顺便说一句,如果我输入的数字长度为 10 位或更多位,则超出范围。当然,我将 input_num int 更改为 int(20)。这可能是一个小提琴问题吗?在 mysql 中,如果有 10 个或更少的数字,代码就可以工作,但如果超过这个数字,结果总是偶数。
  • @User_T 只需将其更改为 BIGINT,您就不会遇到这个问题 :)
【解决方案2】:

如果您使用整数类型(bigintinteger 等)作为i,您应该可以使用

  • 奇数:(i &amp; 0x1) => 1
  • 偶数:(i &amp; 0x1) => 0

完整声明:

UPDATE `test` SET `d` = IF ( ( `i` & 0x1 ) = 1, 'Odd', 'Even' );

【讨论】:

    【解决方案3】:

    自 MySQL 4.X 起,MOD() 函数已包含在 MySQL 中。如果您将有理数评估为 EVEN 或 ODD,则可以使用 MOD 函数。

    见:https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_mod

    MOD(x, y) 函数返回 X 除以 Y 的余数。

    我们可以简单地使用这个函数来确定一个值是偶数还是奇数,方法是传递数字来评估为 X 和 2 为 Y。

    考虑以下示例,其中我们使用 MOD() 对 X 值 8800 和 8801 以及 3 评估 ODD 或 EVEN:

    
    /* Example 1: X=8800, Y=2 */
    
    SELECT MOD(8800, 2);
    
    -- Returns 0 (remainder == 0, so our number is EVEN)
    
    /* Example 2: X=8801, Y=2 */
    
    SELECT MOD(8801, 2);
    
    -- Returns 1 (remainder > 0, so our number is ODD)
    
    /* Example 3: X=3, Y=2 */
    
    SELECT MOD(3, 2);
    
    -- Returns 1 (remainder > 0, so our number is ODD)
    

    如果您希望返回值略有不同,您可以稍微扩展一下,并与 IF/ELSE 流控制修饰符函数 IF() 结合使用。

    见:https://dev.mysql.com/doc/refman/8.0/en/flow-control-functions.html#function_if

    IF(expr1, expr2, expr3) 有 3 个参数。 IF() 计算 expr1,如果 expr1 计算为 TRUE,则返回 expr2。否则,返回 expr3(有一些注意事项,请参阅上面的 MySQL 文档了解更多详细信息)。

    考虑以下示例,我们再次使用 MOD() 对 X 值 8800 和 8801 评估 ODD 或 EVEN:

    
    /* Example 1: X=8800, Y=2 */
    
    SELECT IF(MOD(8800, 2)>0,'ODD','EVEN');
    
    -- Returns 'EVEN' (remainder == 0, so our number is EVEN)
    
    /* Example 2: X=8801, Y=2 */
    
    SELECT IF(MOD(8801, 2)>0,'ODD','EVEN');
    
    -- Returns 'ODD' (remainder > 0, so our number is ODD)
    

    干杯!

    【讨论】:

      【解决方案4】:

      也许你追求的是一个函数而不是一个过程,因为我看不到它是如何从一个表中返回多行的......

      http://sqlfiddle.com/#!2/5090b1/4/0

      MySQL stored procedure vs function, which would I use when? 阅读此处了解何时使用一个与另一个...

      CREATE Function num(I_Num int)
       Returns char(4) deterministic
       RETURN case when mod(left(I_NUM,1),2)=1 then 'Odd' Else 'Even' END;
      
      
      select num(123) odd, num(234) even;
      

      【讨论】:

      • 我喜欢你的回答。如果我在数据库中需要它,我会使用它,但在这种情况下,我只需要它来尝试程序
      猜你喜欢
      • 1970-01-01
      • 2015-07-22
      • 2015-03-03
      • 2011-11-12
      • 2015-05-31
      • 2013-12-09
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多