PDA

View Full Version : مرتب سازی فیلدهایی با مقادیر ترکیبی



hr110
سه شنبه 20 اردیبهشت 1384, 08:56 صبح
سلام
یکی از فیلدهای نرم افزار مقادیری به این شکل دارد:

BP%189%
BP%189/2%
B%129%
QA%176/89%
QA%9%
QA%
BP%276/3%
HP%57/5%
LP%235/2
آیا راهی دارد که این فیلد را به شکل صحیح مرتب نمود، به این شکل که ابتدا بخش اول مرتب شود و سپس بخش دوم نیز به عنوان مقادیر float مد نظر قرار گرفته و مرتب شوند.


برای اطلاع : این مقادیر بخشی از فیلد LC یا رده بندی کنگره میباشد که معمولاً در عطف کتابهایی که از کتابخانه به امانت میگیرید درج میشود و ....
برخی از نرم افزارها که از بانک اطلاعاتی اینتربیس یا فاکس استفاده میکند این امکان مرتب سازی در انها وجود دارد.

JavanSoft
سه شنبه 20 اردیبهشت 1384, 14:13 عصر
فکر کنم این روش جواب بدهد
البته به جای N باید PatIndex مربوط به پیدا کردن % دوم را از جایی که Patindex اولی تمام می شود باید داد


ُSelect SubString(F1,1,2),SubString(F1,PathIndex('%',n)
From T1
Order by 1,2

titbasoft
سه شنبه 20 اردیبهشت 1384, 18:18 عصر
فکر کنم کارتون رو راه بندازه ولی مطمئنا optimize تر هم میشه چون خیلی سریع نوشتمش

declare @t table (f varchar(50))
insert into @t values('BP%189%')
insert into @t values('BP%189/2%')
insert into @t values('B%129%')
insert into @t values('QA%176/89%')
insert into @t values('QA%9%')
insert into @t values('QA%')
insert into @t values('BP%276/3%')
insert into @t values('HP%57/5%')
insert into @t values('LP%235/2')

select f from (
select replace(f,'|','%') f,f1 ,cast(replace(replace(right(f,len(f)-len(f1)),'|',''),'/','.') as float) f2 from(
select substring(f,1, patindex('%|%',f)-1) f1 , f from (
select replace(f,'%','|') f from @t
) as t1
) as t2
) as t3 order by f1,f2
و این هم result set شما:

B%129%
BP%189%
BP%189/2%
BP%276/3%
HP%57/5%
LP%235/2
QA%
QA%9%
QA%176/89%

hr110
چهارشنبه 21 اردیبهشت 1384, 14:10 عصر
:موفق:
بسیار عالی
حال اگه یکی از مقادیر به این شکل بود ، چطور؟:


LP%a235/2
و یا

[LP]%235/2

و مشکل دیگری که ممکن است پیش بیاید در زمانی است که برخی از رکوردها ممکن است مقدار NULL داشته باشند.

از توجه شما سپاسگذارم :flower:

titbasoft
چهارشنبه 21 اردیبهشت 1384, 14:58 عصر
LP%a235/2
لطفا توضیح بدید چطوری باید با این مورد برخورد کرد؟ یعنی بالاخره عدد دوم چیه؟ اصلا نکنه % جدا کننده 2 بخش نیست !؟


[LP]%235/2
خیلی ساده اول ']' و '[' رو با '' replace کنید. نتیجه:

select f from (
select replace(f,'|','%') f,f1 ,cast(replace(replace(right(f,len(f)-len(f1)),'|',''),'/','.') as float) f2 from(
select substring(f,1, patindex('%|%',f)-1) f1 , f from (
select replace(replace(replace(f,'%','|'),'[',''),']','') f from @t --<< changed >>
) as t1
) as t2
) as t3 order by f1,f2

و مشکل دیگری که ممکن است پیش بیاید در زمانی است که برخی از رکوردها ممکن است مقدار NULL داشته باشندمشکلی وجود نحواهد داشت. در بالای لیست قرار خواهند گرفت.

hr110
چهارشنبه 21 اردیبهشت 1384, 15:01 عصر
لطفا توضیح بدید چطوری باید با این مورد برخورد کرد؟ یعنی بالاخره عدد دوم چیه؟ اصلا نکنه % جدا کننده 2 بخش نیست !؟

از % برای جداکننده ها استفاده میشود ولی گاهی اوقات ممکن است بخش دوم عدد نباشد :sad2:

titbasoft
چهارشنبه 21 اردیبهشت 1384, 15:07 عصر
گاهی اوقات ممکن است بخش دوم عدد نباشد
در این صورت چطور باید با آن برخورد کرد؟ یعنی بعضی ها باید رشته ای sort بشن بعضی ها عددی؟

hr110
چهارشنبه 21 اردیبهشت 1384, 15:11 عصر
در واقع بله، چون بخش دوم در این رکوردها وجود ندارد

titbasoft
چهارشنبه 21 اردیبهشت 1384, 16:00 عصر
بخش دوم در این رکوردها وجود ندارد
پس میشه بخش دوم رو null در نظر گرفت؟ اگر بله:

select f from (
select replace(f,'|','%') f,f1 , f2=(
case isnumeric(replace(replace(right(f,len(f)-len(f1)),'|',''),'/','.'))
when 1
then cast(replace(replace(right(f,len(f)-len(f1)),'|',''),'/','.') as float)
else
null
end
) from(
select substring(f,1, patindex('%|%',f)-1) f1 , f from (
select replace(replace(replace(f,'%','|'),'[',''),']','') f from @t
) as t1
) as t2
) as t3 order by f1,f2