などの文字列がありますM1 M3 M4 M14 M30 M40
(実際には、文字の後に2〜3桁のintがあります)「ORDERBY name」を実行すると、次のようになります。
M1, M14, M3, M30, M4, M40
欲しいとき:
M1, M3, M4, M14, M30, M40
全体を文字列として扱いますが、文字列+intとして扱いたいです
何か案は?
などの文字列がありますM1 M3 M4 M14 M30 M40
(実際には、文字の後に2〜3桁のintがあります)「ORDERBY name」を実行すると、次のようになります。
M1, M14, M3, M30, M4, M40
欲しいとき:
M1, M3, M4, M14, M30, M40
全体を文字列として扱いますが、文字列+intとして扱いたいです
何か案は?
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)
たとえば、文字列の先頭に複数の文字が含まれる可能性がある場合は、'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
以下のようにMLS番号を並べ替えていた私の問題では、これを機能させることができませんでした:
V12345 V1000000 V92832
問題は、V1000000が大きいにもかかわらず、他のV1000000よりも高く評価されていなかったことです。
これを使用して私の問題を解決しました:
ORDER BY CAST(SUBSTR(col_name FROM 2) AS UNSIGNED) DESC
削除したばかりSUBSTR(col_name FROM 1 FOR 1)
次を使用できます。
order by name,SUBSTRING(name,1,LENGTH(name)-1)
数字と文字を別々に分割します。
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;
SUBSTRで文字を削除してみてください。次に、ABSを使用して、フィールドから絶対値を取得します。
SELECT * FROM table ORDER BY ABS(SUBSTR(field,1));
私のプロジェクトで使用した別の方法は次のとおりです。
SELECT * FROM table_name ORDER BY LENGTH(col_name) DESC, col_name DESC LIMIT 1