ความสำคัญของผู้ประกอบการลอจิก SQL: และและหรือ


179

ทั้งสองงบด้านล่างเทียบเท่ากันหรือไม่

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

มีตารางความจริงบางอย่างที่ฉันสามารถใช้ตรวจสอบสิ่งนี้ได้ไหม


4
ลอง: TT F. (T หรือ T) และ F. T หรือ (T และ F) ผู้อ่านรหัสควรสามารถเห็นเจตนาของผู้เขียนรหัสได้อย่างชัดเจน และผู้เขียนจะต้องแน่ใจว่าเครื่องทำสิ่งที่เขาตั้งใจ วงเล็บจะจัดตำแหน่งทั้งสาม: เครื่องอ่านตัวเขียนและเครื่อง :)
Assad Ebrahim

คำตอบ:


290

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

สำหรับผู้ที่ต้องการปรึกษาอ้างอิง (ตามลำดับตัวอักษร):


18
เป็นวิธีปฏิบัติที่ดีในการใช้วงเล็บแม้ว่าจะไม่จำเป็นก็ตาม โปรแกรมเมอร์น้อยมาก (ถ้ามี) ทราบความสำคัญของผู้ประกอบการทั้งหมดที่มี
Trismegistos

1
@Trismegistos หวังว่ามันจะไม่เป็นเช่นนั้น ... มันไม่ควรจะเป็นเช่นนั้น แต่ฉันเดาว่าคุณพูดถูก
Charles Bretana

1
นี้ANDแล้วORมีความสำคัญเป็นส่วนหนึ่งของ SQL มาตรฐานหรือไม่
Jaime Hablutzel

@ Jaime ใช่แล้วและ afaik มันเป็นส่วนหนึ่งของมาตรฐานสำหรับทุกภาษาโปรแกรม
Charles Bretana

4
@Bsienn ไม่แน่ใจว่าคุณได้ทำอะไร แต่มันไม่สอดคล้องกับ SQL มาตรฐานและมีเอกสาร MySQL ... dev.mysql.com/doc/refman/5.0/th/operator-precedence.html คุณควรลองอีกครั้ง - อย่างระมัดระวัง เวลา ... ลอง 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 select case when (@x=1 or @y=1) and @z=1 then'T' else 'F' end
Charles Bretana

33

ฉันจะเพิ่ม 2 คะแนน:

  • "IN" เป็น OR หรือ Serial ที่มีเครื่องหมายวงเล็บอยู่รอบ ๆ
  • และมีความสำคัญเหนือกว่าหรือในทุกภาษาที่ฉันรู้

ดังนั้นทั้ง 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

ดังนั้นเมื่อคุณแยกส่วนคำสั่ง IN ขึ้นมาคุณจะแยก ORS อนุกรมและเปลี่ยนลำดับความสำคัญ


gbn มีการเชื่อมโยงใน ORACLE SQL หรือไม่ ถ้าใช่แล้วฉันจะได้รับการเชื่อมโยงผู้ประกอบการทั้งหมดได้อย่างไรและที่ไหน
Asif Mushtaq

2
เท่าที่มันเจ็บปวดฉันจะพูดมันและไม่ได้มีความสำคัญมากกว่าหรือเป็นทับทิม! เพื่อให้ได้สิ่งที่เลวร้ายยิ่ง && จะมีความสำคัญมากกว่า ||! หนึ่งในเหตุผลที่ฉันไม่ชอบทับทิม - มันละเมิดหลักการของความประหลาดใจอย่างน้อยสำหรับฉัน 2.2.1: 007> จริงหรือจริงและเท็จ => เท็จ 2.2.1: 008> จริง || true && false => true
Alex L

23
  1. ตัวดำเนินการทางคณิตศาสตร์
  2. ผู้ประกอบการเชื่อมต่อ
  3. เงื่อนไขการเปรียบเทียบ
  4. IS [NOT] NULL, LIKE, [NOT] IN
  5. [ไม่] ระหว่าง
  6. ไม่เท่ากับ
  7. ไม่ใช่เงื่อนไขเชิงตรรกะ
  8. และเงื่อนไขเชิงตรรกะ
  9. หรือเงื่อนไขเชิงตรรกะ

คุณสามารถใช้วงเล็บเพื่อแทนที่กฎที่มีความสำคัญกว่า


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.