mysql - سلسلة ترتيب SQL كرقم




string numbers (6)

لدي أرقام محفوظة كـ VARCHAR لقاعدة بيانات MySQL. لا أستطيع جعلهم INT بسبب بعض الظروف الأخرى التي تعتمد.

هو أخذها كحرف لا كرقم أثناء الفرز.

في قاعدة البيانات لدي

1 2 3 4 5 6 7 8 9 10...

على صفحتي تظهر قائمة مرتبة مثل هذا:

1 10 2 3 4 5 6 7 8 9

كيف يمكنني جعله يبدو مرتبًا بواسطة الأرقام تصاعديًا؟


إرسال قيمة العمود إلى integer بصراحة

select col from yourtable
order by cast(col as unsigned)

أو ضمنيًا على سبيل المثال باستخدام عملية حسابية تفرض تحويلًا إلى رقم

select col from yourtable
order by col + 0

BTW MySQL يحول السلاسل من اليسار إلى اليمين. أمثلة:

string value  |  integer value after conversion
--------------+--------------------------------
'1'           |  1
'ABC'         |  0   /* the string does not contain a number, so the result is 0 */
'123miles'    |  123 
'$123'        |  0   /* the left side of the string does not start with a number */

تغيير المجال الخاص بك ليكون INT بدلاً من VARCHAR.

لا أستطيع جعلهم INT بسبب بعض الظروف الأخرى التي تعتمد.

ثم قم بإصلاح الظروف المعتمدة أولاً. وإلا فإنك تعمل حول المشكلة الأساسية الحقيقية. يعد استخدام MySQL CAST خيارًا ، ولكنه يخفي مخططك السيئ الذي يجب إصلاحه.


طريقة أخرى للتحويل.

إذا كان لديك حقل السلسلة ، فيمكنك تحويله أو جزءه الرقمي بالطريقة التالية: إضافة الأصفار البادئة لجعل جميع السلاسل الصحيحة متساوية الطول.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( stringfield ) ) , stringfield ) 

أو ترتيب جزء من حقل ما مثل "tensymbols13" و "tensymbols1222" إلخ.

ORDER BY CONCAT( REPEAT(  "0", 18 - LENGTH( LEFT( stringfield , 10 ) ) ) , LEFT( stringfield , 10 ) ) 

كنت أبحث أيضا عن حقول الفرز التي لديها بادئة الحروف. هنا ما اكتشفت الحل. هذا قد يساعد من يبحث عن نفس الحل.

قيم المجال:

FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789

select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc

SUBSTRING(field,3,9) أضع 9 لأن 9 طريقة كافية لي للاحتفاظ بقيم صحيحة مكونة من 9 أرقام كحد أقصى.

لذلك ستكون النتيجة 123456789 123456788 123456787 ... 100 99 ... 2 1


هذا يعمل بالنسبة لي.

select * from tablename
order by cast(columnname as int) asc

يحتوي العمود الذي أقوم بالفرز معه على أي مجموعة من الألفا والرقمي ، لذلك استخدمت الاقتراحات في هذه المشاركة كنقطة بداية وابتكرت ذلك.

DECLARE @tmp TABLE (ID VARCHAR(50));
INSERT INTO @tmp VALUES ('XYZ300');
INSERT INTO @tmp VALUES ('XYZ1002');
INSERT INTO @tmp VALUES ('106');
INSERT INTO @tmp VALUES ('206');
INSERT INTO @tmp VALUES ('1002');
INSERT INTO @tmp VALUES ('J206');
INSERT INTO @tmp VALUES ('J1002');

SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum
FROM @tmp
ORDER BY IsNum, LEN(ID), ID;

النتائج

ID
------------------------
106
206
1002
J206
J1002
XYZ300
XYZ1002

أتمنى أن يساعدك هذا





order