مشکل با عملگر OR در SQL Server!!!
سلام خدمت همه اساتید.
تا جایی که خاطرم هست همیشه عملگر OR اینطور عمل می کرد که اگر چند تا شرط داشتیم و ازون چند تا اولی درست بود دیگه سراغ بقیه شرط ها نمی رفت.
مشکل من از جایی شروع شد که روی یک جدول که چند میلیون رکورد داخلش هست کوئری زدم و دیدم بیش از اون چیزی که فکر میکردم طول میکشه.
بخشی از قسمت شرط کدم به شکل زیر هست:
( ( ( @ViewStatus = 'Daily' ) AND PassDateTime Between @FromDateTime And @ToDateTime ) OR ( @ViewStatus = 'Hourly' AND PassDate >= @FDate AND PassDate <= @TDate AND PassTime >= @FTime AND PassTime <= @TTime ) )
چیزی که توی ذهن من بود اینه که موقعی که پارامتر ViewStatus مقدار Daily داشته باشه، قاعدتا نباید به قسمت دوم OR مراجعه کنه. (اگه اشتباه میگم راهنماییم کنید لطفا)
ولی با تست هایی که انجام دادم مطمین شدم که به اون بخش هم مراجعه می کنه.
برای تست خودم تکه کد زیر را اجرا کردم. توی این تکه کد هم هر دو قسمت OR چک می شه.
کویری را با ترتیب های مختلف برای شرطها چک کردم ولی به جوابی نرسیدم.
DECLARE @flag BIT=0 DECLARE @i INT=1 SELECT * FROM sys.all_columns WHERE @flag = 0 OR OBJECT_ID > ( 1 / ( @i - 1 ) )
از دوستان کسی هست که بهم توضیح بده کجا رو اشتباه میکنم؟
4 پاسخ
چه and چه or :
همه شرط ها بررسی می شند ، حالا or نیاز به یک شرط صحیح داره ، And نیاز به همه
سلام
(چیزی که توی ذهن من بود اینه که موقعی که پارامتر ViewStatus مقدار Daily داشته باشه، قاعدتا نباید به قسمت دوم OR مراجعه کنه.)
چرا نباید این به قسمت دوم مراجعه کند
تعریف عمگر Or:
عمگر Or فقط نياز دارد که حداقل يکی از شرط ها درست باشد
شما دقیقا از کوئریتان چه خروجی می خواهید بگیرید (بهتر است ستونها را نام ببرید تا بهتر بشود کمک کرد)
فکر کنم این جمله درست باشه:
"همه شرط ها بررسی می شند ، حالا or نیاز به یک شرط صحیح داره ، And نیاز به همه "
تقسیم بر صفر زا بخاطر تست خودم انجام میدام که ببینم داخل بخش دوم OR میشه یا نه.
ممنون از دوستان
ضمنا فکر می کنم شما دارید یک تقسیم بر صفر هم انجام میدید ؟ نه ؟
Msg 8134, Level 16, State 1, Line 5 Divide by zero error encountered.