سؤال

لدي بيانات مختلطة في عمود nvarchar (الكلمات والأرقام).وهي أسرع طريقة لفرز البيانات في هذا العمود بترتيب رقمي.

مثال النتيجة:

  • 1
  • 2
  • 3
  • ...
  • 10
  • 11
  • ...
  • aaaa
  • aaab
  • ب
  • بكالوريوس
  • بكالوريوس
  • ...
هل كانت مفيدة؟

المحلول

استخدم هذا:

ORDER BY
    CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
    column

هذا يعمل كما هو متوقع.


ملحوظة:قول انت الطريق السريع.كان إنتاج SQL هذا سريعًا بالنسبة لي، لكن خطة التنفيذ تظهر مسحًا للجدول، متبوعًا بحساب عددي.قد يؤدي هذا إلى نتيجة مؤقتة تحتوي على كافة قيم هذا العمود مع بعض الأعمدة المؤقتة الإضافية لنتائج ISNUMERIC.قد لا يكون التنفيذ سريعًا.

نصائح أخرى

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

الق نظرة على هذا المثال...

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')

Select * From @Temp
Order By Case When IsNumeric(Data) = 1 
              Then Right('0000000000000000000' + Data, 20) 
              Else Data End

لاحظ أيضًا أنه من المهم عند استخدام بيان الحالة أن يقوم كل فرع من بيان الحالة بإرجاع نفس نوع البيانات، وإلا فستحصل على نتائج غير صحيحة أو خطأ.

- التحقق من وجودها
إذا كان موجودًا (اختر * من dbo.sysobjects حيث [id] = object_id(N'dbo.t') AND objectproperty(id, N'IsUserTable') = 1)
إسقاط الجدول dbo.t
يذهب

- إنشاء جدول المثال
إنشاء جدول dbo.t (c varchar(10) ليس فارغًا)
تعيين nocount على

- ملء جدول المثال
أدخل في قيم dbo.t (c) ('1')
أدخل في قيم dbo.t (c) ('2')
أدخل في قيم dbo.t (c) ('3')
أدخل في قيم dbo.t (c) ('10')
أدخل في قيم dbo.t (c) ('11')
أدخل في قيم dbo.t (c) ("aaaa")
أدخل في قيم dbo.t (c) ("aaab")
أدخل في قيم dbo.t (c) ('b')
أدخل في قيم dbo.t (c) ("ba")
أدخل في قيم dbo.t (c) ("ba")

- إرجاع البيانات
حدد ج من dbo.t
الترتيب حسب الحالة عندما يكون غير رقمي (c) = 1 ثم 0 آخر 1 نهاية،
الحالة عندما يكون غير رقمي (c) = 1 ثم يلقي (c كـ int) آخر 0 نهاية،
ج

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

لا أعتقد أن ما تحاول فعله ممكن

هذا المثال يعمل بشكل جيد

SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END

النتيجة هي:

  • أ
  • ب
  • ج
  • ...
  • 1
  • 2
  • 3

لكني بحاجة إلى الأرقام أولاً.

يجب أن يعمل هذا:

select * from Table order by ascii(Column)

ألقها.

SELECT * FROM foo ORDER BY CAST(somecolumn AS int);

لقد مر وقت طويل منذ أن لمست SQL Server، لذلك قد يكون بناء الجملة الخاص بي غير صحيح تمامًا :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top