【问题标题】:Does mysql have function for returning a number with ordinal suffix?mysql是否具有返回带有序号后缀的数字的功能?
【发布时间】:2010-01-06 18:39:49
【问题描述】:

基本上我正在寻找类似的东西

SELECT ordinal(my_number) FROM my_table

会返回

1st
11th
1071st
...
etc

但最好不使用存储过程

【问题讨论】:

  • 糟糕,打字速度比我想象的要快。

标签: mysql ordinals


【解决方案1】:

我不知道内置函数,但它很容易编写:

SELECT
  CONCAT(my_number, CASE
    WHEN my_number%100 BETWEEN 11 AND 13 THEN "th"
    WHEN my_number%10 = 1 THEN "st"
    WHEN my_number%10 = 2 THEN "nd"
    WHEN my_number%10 = 3 THEN "rd"
    ELSE "th"
  END)
FROM my_table;

【讨论】:

  • 对于一般情况,我喜欢这个,尽管我认为my_number % 100 BETWEEN 11 AND 13 对于例外情况的意图更清楚。乍一看,我要评论说你忘记了 11、12、13。
【解决方案2】:

mysql 不支持这个。无论您从哪种语言中获取 mysql 数据,您都必须处理字符串。

【讨论】:

    【解决方案3】:

    根据 Ken 的代码,自定义 MySQL 函数如下:

    DELIMITER $$
    CREATE FUNCTION ordinal(number BIGINT)
    RETURNS VARCHAR(64)
    DETERMINISTIC
    BEGIN
      DECLARE ord VARCHAR(64);
      SET ord = (SELECT CONCAT(number, CASE
        WHEN number%100 BETWEEN 11 AND 13 THEN "th"
        WHEN number%10 = 1 THEN "st"
        WHEN number%10 = 2 THEN "nd"
        WHEN number%10 = 3 THEN "rd"
        ELSE "th"
      END));
      RETURN ord;
    END$$
    DELIMITER ;
    

    那么它可以用作:

    SELECT ordinal(1)  -- 1st
    SELECT ordinal(11) -- 11th
    SELECT ordinal(21) -- 21st
    
    SELECT ordinal(my_number) FROM my_table
    

    【讨论】:

      【解决方案4】:

      在 MySQL 中使用字符串函数是可能的,但它很快就会变得混乱。你最好只用你使用的语言做后缀。例如,在 PHP 中你可以这样做:

      function ordSuffix($num) {
          if(empty($num) || !is_numeric($num) || $num == 0) return $num;
          $lastNum = substr($num, -1);
          $suffix = 'th';
          if($lastNum == 1 && $num != 11) { $suffix = 'st'; }
          elseif($lastNum == 2 && $num != 12) { $suffix = 'nd'; }
          elseif($lastNum == 3 && $num != 13) { $suffix = 'rd'; }
          return $num.$suffix;
      }
      
      echo ordSuffix(4); // 4th
      echo ordSuffix(1); // 1st
      echo ordSuffix(12); // 12th
      echo ordSuffix(1052); // 1052nd
      

      【讨论】:

        【解决方案5】:

        我找到了一种对我有用的方法,但它有点小技巧

        DATE_FORMAT(CONCAT('2010-01-', my_number), '%D')
        

        这很有效,因为目前我正在查看的数字从未超过 25。但它不能很好地概括,所以有人可能会对此感到高兴:

        CONCAT(
            IF(my_number % 100 BETWEEN 11 AND 13,
                FLOOR(my_number / 100),
                FLOOR(my_number / 10)),
            DATE_FORMAT(
                CONCAT('2010-01-', 
                    IF(my_number % 100 BETWEEN 11 AND 13
                        my_number % 100,
                        my_number % 10)),
                '%D'))
        

        但是,当Ken's code 更简单时,要获得DATE_FORMAT 功能就需要做很多工作。

        【讨论】:

          猜你喜欢
          • 2017-05-08
          • 1970-01-01
          • 1970-01-01
          • 2021-05-30
          • 2020-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多