Есть ли в mysql функция для возврата числа с порядковым суффиксом? - PullRequest
1 голос
/ 06 января 2010

В основном я ищу что-то вроде

SELECT ordinal(my_number) FROM my_table

, который вернул бы

1st
11th
1071st
...
etc

но предпочтительно без использования хранимой процедуры

Ответы [ 5 ]

7 голосов
/ 06 января 2010

Я не знаю встроенной функции, но написать ее довольно просто:

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 голос
/ 06 января 2010

mysql не поддерживает это. Вам придется обрабатывать строки на любом языке, с которого вы получаете данные mysql.

0 голосов
/ 26 февраля 2017

На основе кода Кена пользовательская функция 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
0 голосов
/ 07 января 2010

Я нашел способ, который работает для меня, но это немного взломать

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'))

Но это большая работа, чтобы получить функциональность DATE_FORMAT, когда код Кена проще.

0 голосов
/ 06 января 2010

Это возможно в 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
...