MySQL为具有等效数字的值范围创建函数

Posted

技术标签:

【中文标题】MySQL为具有等效数字的值范围创建函数【英文标题】:MySQL create function for range of values with equivalent numbers 【发布时间】:2011-09-13 14:38:05 【问题描述】:

这个函数有什么问题。这是我的预期输出是

 1 = 10
 2 to 3 = 7
 4 to 10 = 5
 11 to 30 = 2
 31 to 100 = 1


DELIMITER $$
DROP FUNCTION IF EXISTS `computeScore`$$
CREATE DEFINER=`root`@`localhost` FUNCTION  `computeScore`(`POS` INT(11)) RETURNS int(11)
    READS SQL DATA
    DETERMINISTIC
BEGIN
    DECLARE ordinal INT;
    SELECT (
        CASE
          WHEN POS < 2 THEN 10
          WHEN POS >= 2 < 4 THEN 7
          WHEN POS >= 4 < 11 THEN 5
          WHEN POS >= 11 < 31 THEN 2
          ELSE 1
        END )
    INTO ordinal;
    RETURN ordinal;
    RETURN 0;
END;

 $$

DELIMITER ;

输出:我总是得到 10

【问题讨论】:

添加了输出,我总是得到 10 【参考方案1】:

试试这个:

SELECT (
        CASE
          WHEN POS < 2 THEN 10
          WHEN POS >= 2 && POS < 4 THEN 7
          WHEN POS >= 4 && POS < 11 THEN 5
          WHEN POS >= 11 && POS < 31 THEN 2
          ELSE 1
        END )

【讨论】:

【参考方案2】:

CASE 部分应该是

    CASE
      WHEN POS < 2 THEN 10
      WHEN POS >= 2 AND POS < 4 THEN 7
      WHEN POS >= 4 AND POS < 11 THEN 5
      WHEN POS >= 11 AND POS < 31 THEN 2
      ELSE 1
    END

【讨论】:

【参考方案3】:

怎么了?

来自关于SELECT..INTO statament 的参考 - 此 SELECT 语法将选定的列直接存储到变量中。因此,只能检索一行。

检查查询是否返回一条记录。

编辑:

代码可以是这样的-

SET ordinal = CASE
  WHEN pos < 2 THEN 10
  WHEN pos >= 2 AND pos < 4 THEN 7
  WHEN pos >= 4 AND pos < 11 THEN 5
  WHEN pos >= 11 AND pos < 31 THEN 2
  ELSE 1
END;

【讨论】:

还有一排。没有使用 FROM。

以上是关于MySQL为具有等效数字的值范围创建函数的主要内容,如果未能解决你的问题,请参考以下文章

要从具有上限/下限的泊松分布中抽取的样本编号

MySQL数据类型 - 字符串数据类型

Python - 创建具有 2 个值之间的数字的列表?

MySQL:创建具有自动增量的表并将生成的值与同一表的不同列的值连接起来

如何找到给定范围内除以给定数字时具有一定余数的值的数量?

确定邮政编码邻近/范围的 MySQL 函数