PDA

View Full Version : مشکل با مقایسه یک ستون رشته ای با null



behnam-soft
چهارشنبه 10 مهر 1392, 13:48 عصر
سلام خدمت دوستان
من یه فرم دارم با چندتاتکس باکس که برای اعمال محدودیت زمانی هستن که کاربر ممکنه یکی، چندتا و همشون رو انتخاب کنه تا با وارد کردن تاریخ مورد نظر، محدودیت تاریخ بذاره رو بعضی چیزا.من نوع این فیلد ها رو در بانک، انورچر تعریف کردم که البته تا اینجای کار مشکلی نیست.
من برای ذخیره این مقادیر، فقط ازیه کوئری استفاده می کنم که اون تکس باکس ها چه تاریخ توشون ثبت شده باشه چه نشده باشه،همه رو در بانک ذخیره می کنه. خب، حالا که می خوام با هر بار وارد شدن به برنامه بگم برو تو جدول بگرد و اگر تاریخ فلان فیلد از تاریخ جاری بیشتر بود نشون بده، برنامه مقادیر خالی رو هم که در بانک واردشده رو حسابمی کنه که قائدتا از هر کراکتری کمتره ! بنابراین اونا همه رو نشون می ده!
این کوئری که من نوشتمه:

select f1,f2,f3 from tblTest where (f1 <=@date and f1<>null) or (f2 <=@date and date <>null) or (f3 <=@date and f3 <>null)

اما این کوئری جواب نمیده !!! نمی دونم مشکلش از کجاست !!! مشکل از کوئری هست یا چیزه دیگه ای؟

fatemesoleimani
چهارشنبه 10 مهر 1392, 14:01 عصر
تو شرط دوم به جای date<>null نباید f2باشه ؟

behnam-soft
چهارشنبه 10 مهر 1392, 17:00 عصر
تو شرط دوم به جای date<>null نباید f2باشه ؟
چرا باید f2 باشه که البته اشتباه تایپی من در اینجا بود اما در برنامه ام درست نوشتم، دوستان کسی نمی دونه مشکل چیه؟

pedramfj
چهارشنبه 10 مهر 1392, 17:06 عصر
سلام
به جای استفاده از کلمه Null از ' ' (تک کوتیشن) استفاده کنید . مشکل حل می شود.

select * from tbl1 where name<>''

Kubuntu
چهارشنبه 10 مهر 1392, 17:22 عصر
سلام
واسه دادن دسترسی به کاربر پیشنهاد می کنم از نوع داده date و برای زمان time استفاده بشه. چون اینطوری خیلی کارا راحتتر می شه. در ضمن جدولی بهینه است که مقدار null نداشته باشه. پس جدولت رو اصلاح کن.
تازه شما گفتی فلان فیلد از تاریخ جاری بیشتر بود، آن فیلد رو نشون بده..... در حالی که علامت شرطتت کوچتکتره نه بزرگتر!

یه چیز دیگه!! من با @date در Sql کار نکردم ولی فکر نکنم مقایسه Date و Nvarchar درست از آب دربیاد. مگر اینکه Nvarchar دقیقا همون مقدار date باشه.

ویرایش:
Nvarchar یعنی حروف غیر انگلسی ذخیره بشه و میزان حافظه اشغالی به اندازه تعداد کاراکتر
Nchar یعنی حروف غیر انگلیسی میزان حافظه اشغالی ثابت است و همون مقداری که می دی اولش
varchar حروف انگلیسی ولی میزان حافظه اشغالی متغیر است مثل Nvarchar
char هم فلسفش مثه Nchar هستش

eshaghrahimy
چهارشنبه 10 مهر 1392, 17:26 عصر
اگر خواستی شرطی را با null چک کنی باید به این شکل عمل کنید where date is not null یا where date is null

behnam-soft
چهارشنبه 10 مهر 1392, 17:49 عصر
سلام
به جای استفاده از کلمه Null از ' ' (تک کوتیشن) استفاده کنید . مشکل حل می شود.

select * from tbl1 where name<>''

با تشکر از شما، کدی که نوشتی رو استفاده کردم مشکل حل شد، ممنون از راهنماییتون.

behnam-soft
چهارشنبه 10 مهر 1392, 17:54 عصر
سلام
واسه دادن دسترسی به کاربر پیشنهاد می کنم از نوع داده date و برای زمان time استفاده بشه. چون اینطوری خیلی کارا راحتتر می شه. در ضمن جدولی بهینه است که مقدار null نداشته باشه. پس جدولت رو اصلاح کن.
تازه شما گفتی فلان فیلد از تاریخ جاری بیشتر بود، آن فیلد رو نشون بده..... در حالی که علامت شرطتت کوچتکتره نه بزرگتر!
یه چیز دیگه!! من با @date در Sql کار نکردم ولی فکر نکنم مقایسه Date و Nvarchar درست از آب دربیاد. مگر اینکه Nvarchar دقیقا همون مقدار date باشه.



بله حرف شما رو کامل قبول دارم، ولی به نظرم گاهی اوقات این مسائل رو نمیشه در برنامه رعایت کرد! یا حداقل من بلد نیستم!!! شما می خوای به کاربر این حق رو بدی که در مورد مثلا 3 تا آیتم، بتونه براشون محدودیت تاریخ بذاره یا نذاره !!! اگر شما راه حل بهتری از این روش من داری بفرمایید تا بنده هم رعایت کنم در برنامه ام.
در مورد اون فیلد هم بله حق با شماست، اون هم متاسفانه اشتباه تایپی بود !!! هر چند که مشکل اصلی در همین مقدار NULL بود که البته با کمک دوستان حل شد.
من با نوع داده DATE در sql کار نکردم اما این روشی رو هم که من استفاده می کنم، خیلی خیلی راحته ! فقط کافیه با یه ماسک تکس باکس، کاربر رو مجبور بکنید تا مقدار تاریخ رو بصورت چهار دو دو وارد کنه و بعد همونرو در بانک ذخیره کنید!!! ضمنا من تا به حال با این قضیه (نوع تاریخ بصورت انورچر) مشکلی نداشتم! یعنی دقیقا مثل تاریخ واقعی کار می کنه !

behnam-soft
چهارشنبه 10 مهر 1392, 17:57 عصر
اگر خواستی شرطی را با null چک کنی باید به این شکل عمل کنید where date is not null یا where date is null
با تشکر از راهنمایی شما، بله کد شمارو هم تست کردم که مشکل رو حل کرد، از راهنمایی تون ممنونم.