سؤال

هل البيانات اثنين أقل من ما يعادل؟

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

لذلك، عند كسر جملة، قمت بتقسيم التسلسل أو تغيير الأسبقية.

  1. العمليات الحسابية
  2. مشغل سلسلة
  3. شروط المقارنة
  4. هو [لا] لاغ، مثل، [لا] في
  5. ليس بينهما
  6. لا يساوي
  7. ليست الحالة المنطقية
  8. والظروف المنطقية
  9. أو الحالة المنطقية

يمكنك استخدام الأقواس لتجاوز قواعد الأسبقية.

الاستعلام لإظهار جدول الحقيقة تعبير منطقية 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top