PDA

View Full Version : ترکیب شرایط در SQL



iran888
پنج شنبه 05 آذر 1383, 06:07 صبح
باسلام
دو مجموعه شرط داریم که در اولی 2 شرط باهم and می شوند و در مجموعه دوم نیز دو شرط باهم and می شوند . و این 2 مجموعه با هم or می شو.ند . برای این کار رعایت پرانتزها لازم است ولی sql server پرانتزهای تودرتو را حذف می کند . چرا؟
مثال :
Select *
From table
Where ((c1 and c2) or (c3 and c4))

setarehman
پنج شنبه 05 آذر 1383, 08:32 صبح
پرانتز لازم نیست بدون اون هم جواب میده
select *from table where table.c1 and table.c2 or table.c3 and table.c4

AminSobati
پنج شنبه 05 آذر 1383, 21:13 عصر
دوست عزیزم،
از نظر جبری، همیشه AND به OR تقدم داره. به این مفهوم که در یک شرط، همیشه طرفین AND اول ارزیابی میشن، بعد از ارزیابی همه ANDها، نوبت به OR ها میرسه. در مثال شما، حتی بدون پرانتز ابتدا c1 و c2 ارزیابی میشن و بعد c3 و c4 حالا نتیجه اونها با هم OR میشن.
موفق باشید

hmm
شنبه 07 آذر 1383, 08:39 صبح
ولی شاید منطقی نباشه
اگه فرض کنیم بجای and ها باید or گذاشته بشه و برعکس درست عمل نمیکنه
یا برای مثال زیر


selec ....
from ....
where
a=1 and ((b=1 and c=1) or (d=1 and e=1))

اگه بدون پرانتز باشد اول دو and اول با هم ترکیب میشوند درصورتی که فرض کنید میخواهیم نتیجه دو and دو و حاصلش با or ایندفعه با and اول ترکیب شود به نظر میرسد که نتیجه متفاوت باشه

setarehman
شنبه 07 آذر 1383, 08:52 صبح
جناب sobati واقعا and به or تقدم داره اما این جور که من یاد گرفتم and و or در یک مرحله از تقدم هستند

vadood
شنبه 07 آذر 1383, 10:49 صبح
از BOL



When more than one logical operator is used in a statement, NOT is evaluated first, then AND, and finally OR. Arithmetic (and bitwise) operators are handled before logical operators.

همچنین از BOL


The use of parentheses, even when not required, can improve the readability of queries and reduce the chance of making a subtle mistake because of operator precedence. There is no significant performance penalty in using parentheses.

AminSobati
شنبه 07 آذر 1383, 17:44 عصر
ولی شاید منطقی نباشه
اگه فرض کنیم بجای and ها باید or گذاشته بشه و برعکس درست عمل نمیکنه
دوست عزیزم،
پرانتز میتونه به کلی تاثیر بگذاره و حتی نتیجه رو عوض کنه:

False and (False or True) => False

False and False or True => True
ولی برای آرایشهای خاصی از AND و OR میتونه خنثی باشه


جناب sobati واقعا and به or تقدم داره اما این جور که من یاد گرفتم and و or در یک مرحله از تقدم هستند
این رو کجا خوندین؟