mysql是否具有返回带序数后缀的数字的功能?

时间:2010-01-06 18:39:50

标签: mysql ordinals

基本上我正在寻找像

这样的东西
SELECT ordinal(my_number) FROM my_table

会返回

1st
11th
1071st
...
etc

但最好不使用存储过程

5 个答案:

答案 0 :(得分:7)

我不知道内置函数,但写起来很容易:

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;

答案 1 :(得分:1)

mysql不支持这个。您将不得不使用从中获取mysql数据的任何语言来处理字符串。

答案 2 :(得分:0)

在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

答案 3 :(得分:0)

我发现了一种对我有用的方法,但它有点像黑客

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功能,这需要做很多工作。

答案 4 :(得分:0)

基于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