1

基本的に私は次のようなものを探しています

SELECT ordinal(my_number) FROM my_table

戻るだろう

1st
11th
1071st
...
etc

ただし、ストアド プロシージャを使用しないことが望ましい

4

5 に答える 5

9

組み込み関数はわかりませんが、書くのはとても簡単です。

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;
于 2010-01-06T19:28:16.673 に答える
1

mysql はこれをサポートしていません。mysql データを取得する言語に関係なく、文字列を処理する必要があります。

于 2010-01-06T18:42:18.607 に答える
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
于 2010-01-06T18:47:32.027 に答える
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 のコードが単純なDATE_FORMAT場合、機能を理解するだけでも大変な作業になります。

于 2010-01-06T21:13:24.567 に答える