الأسبقية SQL منطق المنطق: و
-
12-09-2019 - |
سؤال
هل البيانات اثنين أقل من ما يعادل؟
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3,4,5) AND some_other_expr
و
SELECT [...]
FROM [...]
WHERE some_col in (1,2,3) or some_col in (4,5) AND some_other_expr
هل هناك نوع من طاولة الحقيقة التي يمكنني استخدامها للتحقق من ذلك؟
المحلول
And
لها الأسبقية Or
, ، لذلك، حتى لو a <=> a1 Or a2
Where a And b
ليس هو نفسه
Where a1 Or a2 And b,
لأنه سيتم تنفيذ ذلك
Where a1 Or (a2 And b)
وما تريد، لجعلها هي نفسها، هي التالية (باستخدام الأقواس لتجاوز قواعد الأسبقية):
Where (a1 Or a2) And b
إليك مثال لتوضيح:
Declare @x tinyInt = 1
Declare @y tinyInt = 0
Declare @z tinyInt = 0
Select Case When @x=1 OR @y=1 And @z=1 Then 'T' Else 'F' End -- outputs T
Select Case When (@x=1 OR @y=1) And @z=1 Then 'T' Else 'F' End -- outputs F
بالنسبة لأولئك الذين يحبون استشارة المراجع (بالترتيب الأبجدي):
نصائح أخرى
سأضيف 2 نقطة:
- "في" هو المسلسل بشكل فعال بأقواس من حولهم
- ولديها الأسبقية أو في كل لغة أعرفها
لذلك، تعبيرات 2 هي ببساطة غير متساوية.
WHERE some_col in (1,2,3,4,5) AND some_other_expr
--to the optimiser is this
WHERE
(
some_col = 1 OR
some_col = 2 OR
some_col = 3 OR
some_col = 4 OR
some_col = 5
)
AND
some_other_expr
لذلك، عند كسر جملة، قمت بتقسيم التسلسل أو تغيير الأسبقية.
- العمليات الحسابية
- مشغل سلسلة
- شروط المقارنة
- هو [لا] لاغ، مثل، [لا] في
- ليس بينهما
- لا يساوي
- ليست الحالة المنطقية
- والظروف المنطقية
- أو الحالة المنطقية
يمكنك استخدام الأقواس لتجاوز قواعد الأسبقية.
الاستعلام لإظهار جدول الحقيقة تعبير منطقية 3 متغير:
;WITH cteData AS
(SELECT 0 AS A, 0 AS B, 0 AS C
UNION ALL SELECT 0,0,1
UNION ALL SELECT 0,1,0
UNION ALL SELECT 0,1,1
UNION ALL SELECT 1,0,0
UNION ALL SELECT 1,0,1
UNION ALL SELECT 1,1,0
UNION ALL SELECT 1,1,1
)
SELECT cteData.*,
CASE WHEN
(A=1) OR (B=1) AND (C=1)
THEN 'True' ELSE 'False' END AS Result
FROM cteData
نتائج (A=1) OR (B=1) AND (C=1)
:
A B C Result
0 0 0 False
0 0 1 False
0 1 0 False
0 1 1 True
1 0 0 True
1 0 1 True
1 1 0 True
1 1 1 True
نتائج (A=1) OR ( (B=1) AND (C=1) )
هي نفسها.
نتائج ( (A=1) OR (B=1) ) AND (C=1)
:
A B C Result
0 0 0 False
0 0 1 False
0 1 0 False
0 1 1 True
1 0 0 False
1 0 1 True
1 1 0 False
1 1 1 True
لا تنتمي إلى StackOverflow