14

などの文字列がありますM1 M3 M4 M14 M30 M40(実際には、文字の後に2〜3桁のintがあります)「ORDERBY name」を実行すると、次のようになります。

M1, M14, M3, M30, M4, M40

欲しいとき:

M1, M3, M4, M14, M30, M40 全体を文字列として扱いますが、文字列+intとして扱いたいです

何か案は?

4

7 に答える 7

16

ORDERBY内でSUBSTRおよびCASTASUNSIGNED/SIGNEDを使用できます。

SELECT * FROM table_name ORDER BY
    SUBSTR(col_name FROM 1 FOR 1),
    CAST(SUBSTR(col_name FROM 2) AS UNSIGNED)
于 2012-08-23T18:04:01.093 に答える
3

たとえば、文字列の先頭に複数の文字が含まれる可能性がある場合は、'M10', 'MTR10', 'ABCD50', 'JL8', etc...基本的に、数値の最初の位置から名前の部分文字列を取得する必要があります。

残念ながら、MySQLはその種のREGEXP操作をサポートしていません(実際の一致ではなく、ブール値のみが返されます)。

このソリューションを使用して、次のようにエミュレートできます。

SELECT   name
FROM     tbl
ORDER BY CASE WHEN ASCII(SUBSTRING(name,1)) BETWEEN 48 AND 57 THEN
                   CAST(name AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,2)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,1)
              WHEN ASCII(SUBSTRING(name,3)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,2)
              WHEN ASCII(SUBSTRING(name,4)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,3)
              WHEN ASCII(SUBSTRING(name,5)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,4)
              WHEN ASCII(SUBSTRING(name,6)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,5)
              WHEN ASCII(SUBSTRING(name,7)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,6)
              WHEN ASCII(SUBSTRING(name,8)) BETWEEN 48 AND 57 THEN
                   SUBSTRING(name,1,7)
         END,
         CASE WHEN ASCII(SUBSTRING(name,1)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,1) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,2)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,2) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,3)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,3) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,4)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,4) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,5)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,5) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,6)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,6) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,7)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,7) AS UNSIGNED)
              WHEN ASCII(SUBSTRING(name,8)) BETWEEN 48 AND 57 THEN
                   CAST(SUBSTRING(name,8) AS UNSIGNED)
         END

これは、最初に文字列の文字部分で順序付けられ、次に文字列の先頭に7文字未満である限り、文字列の抽出された数字部分で順序付けられます。さらに必要な場合は、ステートメントに追加WHENのsをチェーンするだけです。CASE

于 2012-08-23T18:29:34.960 に答える
2

以下のようにMLS番号を並べ替えていた私の問題では、これを機能させることができませんでした:

V12345 V1000000 V92832

問題は、V1000000が大きいにもかかわらず、他のV1000000よりも高く評価されていなかったことです。

これを使用して私の問題を解決しました:

ORDER BY CAST(SUBSTR(col_name FROM 2) AS UNSIGNED) DESC

削除したばかりSUBSTR(col_name FROM 1 FOR 1)

于 2013-07-16T18:21:19.640 に答える
1

次を使用できます。

order by name,SUBSTRING(name,1,LENGTH(name)-1)
于 2012-08-23T18:07:24.027 に答える
0

数字と文字を別々に分割します。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(
SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col,'1', 1), '2', 1), '3', 1), '4', 1), '5', 1), '6', 1)
, '7', 1), '8', 1), '9', 1), '0', 1) as new_col  
FROM table group by new_col; 
于 2013-04-08T12:35:14.297 に答える
0

SUBSTRで文字を削除してみてください。次に、ABSを使用して、フィールドから絶対値を取得します。

SELECT * FROM table ORDER BY ABS(SUBSTR(field,1));
于 2016-11-08T13:19:06.227 に答える
0

私のプロジェクトで使用した別の方法は次のとおりです。

SELECT * FROM table_name ORDER BY LENGTH(col_name) DESC, col_name DESC LIMIT 1 
于 2020-07-02T10:23:54.820 に答える