基本上我正在寻找类似的东西
SELECT ordinal(my_number) FROM my_table
这将返回
1st
11th
1071st
...
etc
但最好不使用存储过程
我不知道内置函数,但它很容易编写:
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;
mysql 不支持这个。无论您从哪种语言中获取 mysql 数据,您都必须处理字符串。
根据 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
在 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
我找到了一种对我有用的方法,但它有点 hack
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 的代码更简单时,仅仅为了获得DATE_FORMAT
功能就需要做很多工作。