PDA

View Full Version : جستجوی رشته عددی



mostapha
دوشنبه 23 آذر 1388, 23:03 عصر
سلام دوستان
کسی میدونه چطور میشه یک فیلد رشته ای رو در SQL Query با استفاده از Between جستجو کرد؟
آخه همونطور که میدونید SQL بین دو رشته '50' و '100' ، رشته '50' رو بزرگتر میگیره و کلا نتیجه جستجو یه چیز دیگست.

DataMaster
دوشنبه 23 آذر 1388, 23:31 عصر
چرا تبدیل به عدد نمی کنید؟ از توابع Cast و Convert میتونید کمک بگیرید

mostapha
سه شنبه 24 آذر 1388, 15:37 عصر
متشکر از اهنماییت. ولی اگر کاربر کاراکتر غیر عددی رو هم وارد کرده بود چی؟
چون برنامه در این مورد نباید محدودیت میداشته

pezhvakco
سه شنبه 24 آذر 1388, 16:58 عصر
جستجوی اسکیوال بر اساس کاراکتر به کارکتر است و از ابتدا تا انتهای یه مقدار را برررسی می کند ، به همین دلیل 50 را بالاتر ار 100 در نظر می گیرد .
اگر داده ها را می توانید به عددی تبدیل نمایید و گر نه هیچ ...

محمد سلیم آبادی
چهارشنبه 25 آذر 1388, 09:10 صبح
سلام دوستان
کسی میدونه چطور میشه یک فیلد رشته ای رو در SQL Query با استفاده از Between جستجو کرد؟
آخه همونطور که میدونید SQL بین دو رشته '50' و '100' ، رشته '50' رو بزرگتر میگیره و کلا نتیجه جستجو یه چیز دیگست
سلام،
دو سناریو وجود داره:
اول اینکه شما تنها کاراکتر های عددی را به شکل رشته ذخیره کردین و نمی خواهین از توابع تبدیلی استفاده کنین که در این صورت امکان مقایسه با کمک گرفتن از تابع len امکان پذیر است. بطور مثال:


declare @t table (i varchar(3))
insert into @t values ('1'),('10'),('50'),('400'),('600'),('5'),('36'),( '301')

select *
from @t
where len(i)+i between len('50')+'50' and len('400')+'400'
order by len(i)+i

/* Result
i
----
50
301
400
*/


دوم اینکه ممکن است کاراکتر های غیر عددی در بین داده ها وجود داشته باشد که در این مورد شما ناچارین که از یک UDF استفاده کنین:




create function dbo.JustNumber (@value nvarchar(25)) returns int as
begin
declare @r nvarchar(25)='', @i int=1
while @i <= len(@value)
begin
if substring(@value,@i,1) between '0' and '9'
set @r+=substring(@value,@i,1)
set @i+=1
end
return cast(@r as int)
end

go

declare @t table (i varchar(20))
insert into @t values ('a1a'),('f1j0'),('50'),('40s0'),('s ;600'),('5'),('36'),('301')

select dbo.JustNumber(i)
from @t
where dbo.JustNumber(i) between 50 and 400
order by dbo.JustNumber(i)

/* Result
i
----
50
301
400
*/

AminSobati
چهارشنبه 25 آذر 1388, 12:35 عصر
سلام دوست عزیزم،
شما میتونین به روشهای مختلف این String رو Parse کنین. توصیه میکنم حتما این مقاله رو ببینید:

http://www.sommarskog.se/arrays-in-sql.html