ورود

View Full Version : جستجو بر اساس null



Iran58
دوشنبه 21 اردیبهشت 1394, 14:35 عصر
سلام
یک جدول داریم که درآن اسامی نفرات و تاریخ(میلادی) ورود آنها را ثبت می کنیم
حال می خواهیم یک کوئری بنویسیم که از یک تاریخ1 تا تاریخ 2 اسامی اشخاص را بدهد تا اینجا کار مشکلی نیست
حال می خواهم کوئری را طوری بنویسم که اگر کاربربرای تاریخ 1وتاریخ 2 داده ای وارد نکرد کل اسامی را برای ما برگرداند (انگار نه انگار تاریخی درشرط برقرار بوده است)

SabaSabouhi
دوشنبه 21 اردیبهشت 1394, 16:04 عصر
سلام
یک جدول داریم که درآن اسامی نفرات و تاریخ(میلادی) ورود آنها را ثبت می کنیم
حال می خواهیم یک کوئری بنویسیم که از یک تاریخ1 تا تاریخ 2 اسامی اشخاص را بدهد تا اینجا کار مشکلی نیست
حال می خواهم کوئری را طوری بنویسم که اگر کاربربرای تاریخ 1وتاریخ 2 داده ای وارد نکرد کل اسامی را برای ما برگرداند (انگار نه انگار تاریخی درشرط برقرار بوده است)

سلام
پرسش رو شفاف نپرسیدی. اول باید روشن می‌کردی که این Query رو کجا می‌خوای بنویسی. آیا تو SP یا تو SourceCode به صورت String و یا LinQ
هر کدوم اینا یه جواب مخصوص خودش داره.
من فرض می‌کنم منظورت به صورت String تو Source هست.


var whereClause = "";
if ( date1 != null && date2 != null )
whereClause = string.Format( "MyDate BETWEEN '{0}' AND '{1}'", date1.ToString( "yyyy/MM/dd" ), date2.ToString( "yyyy/MM/dd" ) );
else if ( date1 != null )
whereClause = string.Format( "MyDate >= '{0}'", date1.ToString( "yyyy/MM/dd" ) );
else if ( date2 != null )
whereClause = string.Format( "MyDate <= '{0}'", date2.ToString( "yyyy/MM/dd" ) );

var query = "SELECT * FROM MyTable";
if ( !string.IsNullOrEmpty( whereClause ))
query = query + " WHERE " + whereClause;

تو این حالت، اگه هیچ تاریخی ندی، تمام پاسخ‌ها میان، اگه تاریخ 1 رو بدی، اون رو به عنوان حداقل حساب می‌کنه
و اگه تاریخ 2 رو بدی اون رو به عنوان حداکثر حساب می‌کنه و اگه هر دو تاریخ رو بدی، بینشون رو در نظر می‌گیره.

صبا صبوحی

Iran58
دوشنبه 21 اردیبهشت 1394, 16:50 عصر
باسلام وسپاس از لطفی که دارید وباحوصله جواب سوالات را می دهید من در spمی خواهم بنویسم
من Spزیر را نوشته ام
create Procedure [dbo].[S__Search]
@FDate nvarchar(100)
,@EDate nvarchar(100)
AS
begin
select * from test
where test.[Date] between @FDate and @EDate


درقسمت where مشکل دارم
با spبالا اسامی تاریخ ماببین را می توانم بدست آورم اما می خواهم اگر جای متغیرها خالی رد شد اسامی کل را بدهد نمی دانم چطوری بنویسم
باتشکر

havakili
دوشنبه 21 اردیبهشت 1394, 18:52 عصر
با سلام
اگر میخوام قسمت شرط کوئری در صورتی که توسط کاربر خالی به پروسجر ارسال شد مشکلی پیش نیاد فقط کافیه مقدار پیش فرض واسش بذاری همین
ولی در صورتی که مقدار پیش فرض مطابق با فرمت فیلد و مقادیر فیلد باشد.
create Procedure [dbo].[S__Search]
@FDate nvarchar(100)='0000/00/00'
,@EDate nvarchar(100)='9999/99/99'
AS
begin
select * from test
where test.[Date] between @FDate and @EDate

با تشکر
هر چند میتونی از دستورات شرطی هم واسه چک کردن متغییر ها هم استفاده کنی

soheileee
سه شنبه 22 اردیبهشت 1394, 00:36 صبح
حال می خواهم کوئری را طوری بنویسم که اگر کاربربرای تاریخ 1وتاریخ 2 داده ای وارد نکرد کل اسامی را برای ما برگرداند (انگار نه انگار تاریخی درشرط برقرار بوده است)

خیلی ساده ست، باید به متغیرت یه مقدار اولیه نسبت بدی و بعدش یه شرط OR بذاری.
بهتره که برای مقدار اولیه هات یه چیز معنا دار در نظر بگیری.
یه چیزی مثل این:


create Procedure [dbo].[S__Search]
@FDate nvarchar(100) = '1900-01-01'
,@EDate nvarchar(100) = '2200-12-31'
AS
begin
select *
from test
where @FDate = '1900-01-01'
AND @EDate = '2200-12-31'
OR (test.[Date] between @FDate and @EDate)



حالا می تونی SP مورد نظر رو با یک پارامتر، هر دو پارامتر یا هیچ کدوم صدا بزنی:



exec S__Search @FDate='2015-01-07'
exec S__Search @EDate='2015-01-06'
exec S__Search '2015-01-07' , '2015-01-09'

SabaSabouhi
سه شنبه 22 اردیبهشت 1394, 08:02 صبح
باسلام وسپاس از لطفی که دارید وباحوصله جواب سوالات را می دهید من در spمی خواهم بنویسم
من Spزیر را نوشته ام
create Procedure [dbo].[S__Search]
@FDate nvarchar(100)
,@EDate nvarchar(100)
AS
begin
select * from test
where test.[Date] between @FDate and @EDate


درقسمت where مشکل دارم
با spبالا اسامی تاریخ ماببین را می توانم بدست آورم اما می خواهم اگر جای متغیرها خالی رد شد اسامی کل را بدهد نمی دانم چطوری بنویسم
باتشکر

سلام
اگه می‌خوای تو SP بنویسی، خیلی ساده از IF استفاده کن.


IF @Date1 is null AND @Date2 is null
SELECT . . .
FROM . . .
ELSE IF @Date1 is null
SELECT . . .
FROM . . .
WHERE Date <= @Date2
ELSE IF @Date2 is null
SELECT . . .
FROM . . .
WHERE Date >= @Date1
ELSE
SELECT . . .
FROM . . .
WHERE Date BETWEEN @Date1 AND @Date2


ممکنه یه کم حجم این SP بزرگ به نظر برسه، اما از نظر سرعت مشکلی نداره و تمام حالت‌هایی که
می‌خوای رو هم پوشش می‌ده.

صبا صبوحی

havakili
سه شنبه 29 اردیبهشت 1394, 21:55 عصر
سلام
لازم به اینهمه پیچیدگی نیست فقط کافیه از مقدار پیش فرض استفاده کنی یا دستورات شرطی استفاده کنی مشروط به سادگی کد مثال زیر رو ببینید


create Procedure [dbo].[S__Search]
@FDate nvarchar(100),
@EDate nvarchar(100)
AS
begin
select * from test
where test.[Date] between isnull(@FDate,'0000/00/00') and isnull(@EDate,'9999/99/99')
end