จะเขียนคำสั่ง IF ELSE ในแบบสอบถาม MySQL ได้อย่างไร


87

ฉันจะเขียนคำสั่ง IF ELSE ในแบบสอบถาม MySQL ได้อย่างไร

สิ่งนี้:

mysql_query("...(irrelevant code).. IF(action==2&&state==0){state=1}");

จากนั้นลงในอาร์เรย์ของฉันฉันควรจะทำได้:

 $row['state'] 
//this should equal 1, the query should not change anything in the database, 
//just the variable for returning the information

คำตอบ:


153

คุณอาจต้องการที่จะใช้การแสดงออกCASE

มีลักษณะดังนี้:

SELECT col1, col2, (case when (action = 2 and state = 0) 
 THEN
      1 
 ELSE
      0 
 END)
 as state from tbl1;

1
ขอบคุณคำตอบของคุณดูเหมือนจะง่ายกว่าในการติดตาม (ถึงกรณีที่สมมติว่าอยู่ในแบบสอบถามอย่างไรก็ตามฉันไม่สามารถทำให้มันทำงานได้อย่างถูกต้อง: "SELECT *, N.id (CASE WHEN (N. action == 2 AND N.state == 0) แล้ว 1 ELSE 0 END) เป็น Nstate จากการแจ้งเตือน N โพสต์ P WHERE N.userID = '$ session' AND N. uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDER BY N.date DESC "
Dylan Cross

2
@DylanCross ดูเหมือนว่าคุณอาจจะไม่มีเครื่องหมายจุลภาคระหว่างN.idและ(CASE WHEN ...
Jack Edmonds

1
อ่าไม่เห็น แต่ถึงฉันใส่ลูกน้ำมันก็ไม่ได้ผล
Dylan Cross

@DylanCross คุณอาจต้องเปลี่ยนAS N.stateเป็นAS state.
Jack Edmonds

8
@DylanCross ไม่ใช้ MySQL =แทน==การเปรียบเทียบใช่หรือไม่?
Jack Edmonds

29

คุณต้องเขียนใน SQL ไม่ใช่สไตล์ C / PHP

IF( action = 2 AND state = 0, 1, 0 ) AS state

เพื่อใช้ในการสืบค้น

IF ( action = 2 AND state = 0 ) THEN SET state = 1

สำหรับใช้ในโพรซีเดอร์หรือฟังก์ชันที่จัดเก็บไว้


ฉันไม่สามารถทำให้สิ่งนี้ทำงานกับรหัสของฉันได้บางทีตำแหน่งของฉันอาจผิดหรือบางอย่าง: SELECT *, N.id IF (N.action = 2 AND N.state = 0, 1, 0) เป็น Nstate จาก การแจ้งเตือน N โพสต์ P WHERE N.userID = '$ session' AND N. uniqueID = P.id AND P.state = '0' AND N.action = '1' ORDER BY N.date DESC
Dylan Cross

15

คุณกำลังมองหาcase:

case when action = 2 and state = 0 then 1 else 0 end as state

MySQL มีifไวยากรณ์ ( if(action=2 and state=0, 1, 0)) แต่caseมีความเป็นสากลมากกว่า

โปรดทราบว่าas stateมีเพียงแค่นามแฝงคอลัมน์ ฉันสมมติว่านี่อยู่ในรายการคอลัมน์ของแบบสอบถาม SQL ของคุณ


นี่เป็นคำตอบที่ดีกว่ามาก
bretterer

15
SELECT col1, col2, IF( action = 2 AND state = 0, 1, 0 ) AS state from tbl1;

หรือ

SELECT col1, col2, (case when (action = 2 and state = 0) then 1 else 0 end) as state from tbl1;

ผลลัพธ์ทั้งสองจะเหมือนกัน ....


สิ่งหนึ่งที่ฉันสังเกตเห็น แต่ไม่พบเอกสารประกอบคือ IF จะต้องอยู่สุดท้ายในรายการคอลัมน์ หากเป็นครั้งแรกแสดงว่ามีข้อผิดพลาด ใครทราบว่าจะดูสิ่งนี้ในเอกสารได้ที่ไหน มันทำให้ฉันบ้า เมื่อฉันค้นพบบางสิ่งฉันชอบที่จะเห็นมันถูกบันทึกไว้เพื่อใช้อ้างอิงในอนาคต
carinlynchin

8

ตามคู่มืออ้างอิง mySQL ไวยากรณ์ของการใช้คำสั่ง if และ else:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

ดังนั้นเกี่ยวกับคำถามของคุณ:

x = IF((action=2)&&(state=0),1,2);

หรือคุณสามารถใช้

IF ((action=2)&&(state=0)) then 
state = 1;
ELSE 
state = 2;
END IF;

มีตัวอย่างที่ดีในลิงค์นี้: http://easysolutionweb.com/sql-pl-sql/how-to-use-if-and-else-in-mysql/


2
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มีมัน: เพิ่มบริบทรอบ ๆ ลิงก์เพื่อให้ผู้ใช้เพื่อนของคุณมีความคิดว่ามันคืออะไรและทำไมจึงอยู่ที่นั่นจากนั้นอ้างถึงส่วนที่เกี่ยวข้องที่สุดของเพจ การเชื่อมโยงอีกครั้งในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่มากกว่าลิงก์เพียงเล็กน้อยอาจถูกลบ
มี.ค.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.