نمایش نتایج 1 تا 15 از 15

نام تاپیک: مشکل در مرتب کردن بر حسب اعدادی که به صورت رشته ای ذخیره شده اند

  1. #1

    مشکل در مرتب کردن بر حسب اعدادی که به صورت رشته ای ذخیره شده اند

    سلام
    من در یک جدول یک فیلد به نام serial از نوع رشته دارم که کلید جدولم هم هست.
    وقتی که میخوام بترتیب اعداد از کوچکتر به بزرگتر از این جدول select بگیرم درست کار نمیکنه به اینصورت که در مرتب کردن اعداد به طول اعداد توجهی نمیکنه مثلا بجای اینکه عدد 1425 قبل از 11256 بیاد بعد از اون میاد چون رقم دوم عدد 1425 از رقم دوم عدد 11256 بزرگتره!
    انشاله که منظورمو فهمیدین.
    به نظر شما دلیلش چیه و چیکار باید بکنم که درست بشه؟

    با سپاس بسیار.

  2. #2
    کاربر دائمی آواتار iman_22a
    تاریخ عضویت
    بهمن 1383
    محل زندگی
    اهواز
    پست
    815
    یک دلیلش اینه که نوع ستون رو رشته گذاشتید و توی مقایسه رشته ها وقتی به مقایسه 1425 با 11256 می رسه مقایسه رو از سمت چپ به راست شروع می کنه چون اینها در واقع رشته هستند و برای مقایسه رشته ها از چپ براست مثایسه انجام می شه . پس 1425 بعد از 11256 میاد .

  3. #3
    دلیلش اینه که نوع فیلد رو String گذاشتی راه حلش هم اینه که خب بکنیش Int اما اگر نمیخوای بکنی اینطوری سورت کن Select .... order by cast(Field as int)

  4. #4
    با تشکر
    به این دلیل رشته گذاشتم که در این فیلد ممکنه که سریالهایی که ترکیبی از حرف و عدد هستند هم وجود داشته باشند .
    اون راهی که جناب کوشا فرمودند با حروف هم درست کار میکنه؟

  5. #5
    دوستان به نظر شما میشه براش یه الگوریتم با استفاده از توابع موجود نوشت که این کار را انجام بده؟
    اون راه جناب کوشا هم امتحان کردم برای حروف جواب نمیده .
    من هر چی تلاش کردم نشد، اگه راهی به نظرتون میرسه لطف کنید و در اینجا بنویسید.

    ممنون

  6. #6
    من منظورت رو از حروف نمیفهمم ؟! یعنی مثلا انتظار داری مثلا 134 با 3ب1 مقایسه بشه ؟ اونم نه به شکل حرفی بلکه به شکل عددی؟!!
    تنها حالتی که ممکنه کارت رو راه بندازه اینه که همه رشته ها رو با گذاشتن صفر در آخرشون هم طول بکنی .(نه لزما توی دیتا بلکه مثلا یک تابع بنویسی که این کار رو بکنه و بعد زمان Order کردن مثلا جای همون Cast ازش استفاده کنی)

  7. #7
    یک راهی که می تونه مشکل شما رو حل کنه:

    فرض کنیم شما تاریخ رو به شکل 23/1/1386 توی این فیلد داری...
    حالا می خوای این فیلد رو بر این اساس مرتب کنی که به ترتیب تاریخ باشه
    یک راه اینه که از داخل این رشته علامت های اضافی مثل / در اینجا رو حذف کنی و به این فرمت ذخیره کنی مثلا اینجا میشه اینجوری : 13860123 و بعد مرتب کنی به راحتی.

    راه دیگه اینه که توی order by استرینگ کانورت شده رو مرتب کنی مثلا بگی

    order by convert(int,substring(field1,0,4))

  8. #8

    create table #t1(
    c1 varchar(10)
    )
    go

    insert #t1 select '5'
    insert #t1 select '1'
    insert #t1 select '123'
    go

    select * from #t1 order by c1
    select * from #t1 order by cast(c1 as int)

  9. #9
    نقل قول نوشته شده توسط ghabil مشاهده تاپیک
    من منظورت رو از حروف نمیفهمم ؟! یعنی مثلا انتظار داری مثلا 134 با 3ب1 مقایسه بشه ؟ اونم نه به شکل حرفی بلکه به شکل عددی؟!!
    تنها حالتی که ممکنه کارت رو راه بندازه اینه که همه رشته ها رو با گذاشتن صفر در آخرشون هم طول بکنی .(نه لزما توی دیتا بلکه مثلا یک تابع بنویسی که این کار رو بکنه و بعد زمان Order کردن مثلا جای همون Cast ازش استفاده کنی)
    حالا اون حرفو ول کن، شما یه الگوریتمی بگو که اعداد رشته ای رو بر حسب اندازه اعداد مرتب کنه نه مثل دیکشنری( و بدون دستکاری سریالها و استاندارد کردن اونها)

    نقل قول نوشته شده توسط reza_rad مشاهده تاپیک
    یک راهی که می تونه مشکل شما رو حل کنه:

    فرض کنیم شما تاریخ رو به شکل 23/1/1386 توی این فیلد داری...
    حالا می خوای این فیلد رو بر این اساس مرتب کنی که به ترتیب تاریخ باشه
    یک راه اینه که از داخل این رشته علامت های اضافی مثل / در اینجا رو حذف کنی و به این فرمت ذخیره کنی مثلا اینجا میشه اینجوری : 13860123 و بعد مرتب کنی به راحتی.

    راه دیگه اینه که توی order by استرینگ کانورت شده رو مرتب کنی مثلا بگی

    order by convert(int,substring(field1,0,4))
    آقا رضا فیلدم تاریخ نیست، یک فیلد از نوع رشته هست که اعداد رو بصورت رشته ای توش ذخیره میکنم.

    نقل قول نوشته شده توسط AminSobati مشاهده تاپیک

    create table #t1(
    c1 varchar(10)
    )
    go

    insert #t1 select '5'
    insert #t1 select '1'
    insert #t1 select '123'
    go

    select * from #t1 order by c1
    select * from #t1 order by cast(c1 as int)
    میشه یه کمی توضیح بدین؟؟

  10. #10
    آیا sql server تابعی داره که یک عدد کاراکتری رو بگیره و معادل عددیشو بده(مثلا '9' رو بگیره و 9 رو برگردونه)؟

  11. #11
    نقل قول نوشته شده توسط icmaster مشاهده تاپیک
    شما یه الگوریتمی بگو که اعداد رشته ای رو بر حسب اندازه اعداد مرتب کنه نه مثل دیکشنری( و بدون دستکاری سریالها و استاندارد کردن اونها)
    گفتم دیگه یک تابع بنویس که پشت رشته هات رو به اندازه طول ماکسیمم فیلد منهای طول رشته صفر بزاره ، این تابع اطلاعات رو عوض نمیکنه فقط مثلا اگه اسمش هست SameLength اینطوری ازش استفاده میکنی

    Select ..... order by SameLength(fieldName)


    این موجب میشه که زمان سورت هم اندازه بشند و فقط درست سورت بشند.

    نقل قول نوشته شده توسط icmaster مشاهده تاپیک
    آیا sql server تابعی داره که یک عدد کاراکتری رو بگیره و معادل عددیشو بده(مثلا '9' رو بگیره و 9 رو برگردونه)؟
    همون Cast که اول برات نوشتم دیگه

  12. #12
    آقا رضا فیلدم تاریخ نیست، یک فیلد از نوع رشته هست که اعداد رو بصورت رشته ای توش ذخیره میکنم.
    من مثال زدم تاریخ... در کل روش کار یکیه

    بیشتر توضیح بده که می خوای چی کار کنی؟

  13. #13
    سلام

    نقل قول نوشته شده توسط ghabil مشاهده تاپیک
    گفتم دیگه یک تابع بنویس که پشت رشته هات رو به اندازه طول ماکسیمم فیلد منهای طول رشته صفر بزاره ، این تابع اطلاعات رو عوض نمیکنه فقط مثلا اگه اسمش هست SameLength اینطوری ازش استفاده میکنی

    Select ..... order by SameLength(fieldName)


    این موجب میشه که زمان سورت هم اندازه بشند و فقط درست سورت بشند.



    همون Cast که اول برات نوشتم دیگه
    ممنون.
    اون تابع رو میشه با SQL SERVER نوشت؟
    اخه من هر چی گشتم تابعی مثلا برای برگردوندن طول رشته پیدا نکردم؟

    نقل قول نوشته شده توسط reza_rad مشاهده تاپیک
    من مثال زدم تاریخ... در کل روش کار یکیه

    بیشتر توضیح بده که می خوای چی کار کنی؟
    من یک فیلد در دیتابیسم دارم بنام serial و از نوع رشته که توش مثلا شماره سریال یه سری دستگاه رو ذخیره میکنم و از اونجا که در شماره سریال بعضی از دستگاهها حروف انگلیسی هم وجود داره به ناچار اون فیلد رو رشته انتخاب کردم.
    حالا میخوام که اطلاعاتم بصورت مرتب شده بر حسب اندازه عددی شماره سریالها مرتب بشه.
    اون تابعی که آقای کوشا فرمودند فکر کنم درست باشه ولی تابعشو در sql server نمیدونم چطوری بنویسم.

  14. #14
    نقل قول نوشته شده توسط icmaster مشاهده تاپیک
    اخه من هر چی گشتم تابعی مثلا برای برگردوندن طول رشته پیدا نکردم؟
    تابع LEN طول رشته رو بر میگردونه .
    اینم یک کد که برای تست تو QueryAnalyzer نوشتم خوت تابش کن دیگه :


    declare @aw varchar(20);
    set @aw = 'alie';
    while len(@aw) < 20
    set @aw = '0' + @aw
    select @aw

  15. #15
    نقل قول نوشته شده توسط icmaster مشاهده تاپیک
    آیا sql server تابعی داره که یک عدد کاراکتری رو بگیره و معادل عددیشو بده(مثلا '9' رو بگیره و 9 رو برگردونه)؟
    مثالی که نوشتم رو دقت کردین؟ چون دقیقا همین کار رو انجام میده!

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •