ใช้ IF ใน MySQL (ไม่ใช่ฟังก์ชัน)

ฉันมีคำถามที่รู้สึกเหมือนเป็นคำถามง่ายๆ แต่ดูเหมือนจะไม่เข้าใจ ฉันแค่พยายามดำเนินการตรรกะ IF ... THEN ... ปกติ แต่ดูเหมือนจะไม่ถูกต้อง:

set @var:=2;
if @var=1 THEN select 'hello';

ฉันเข้าใจ:

ข้อผิดพลาด 1064 (42000):

คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้กับ 'if @var=1 จากนั้นเลือก 'hello' ที่บรรทัด 1

ฉันพลาดอะไรไป?


person Mordechai    schedule 12.11.2012    source แหล่งที่มา
comment
คุณสามารถดำเนินการคำสั่งเหล่านี้ได้ในขั้นตอนหรือฟังก์ชันเท่านั้น   -  person juergen d    schedule 12.11.2012
comment
มันเกือบจะยากที่จะเชื่อ พวกเขามีเหตุผลสำหรับข้อกำหนดที่โหดร้ายและผิดปกติเช่นนี้หรือไม่?   -  person Mordechai    schedule 12.11.2012


คำตอบ (2)


คุณสามารถทำได้ แต่เฉพาะภายในฟังก์ชัน ขั้นตอน และทริกเกอร์ดังนี้:

DELIMITER //
DROP PROCEDURE IF EXISTS anyname//
CREATE PROCEDURE anyname()
BEGIN
    IF @var1 = 1 THEN
        SELECT 'hello';
    END IF;
END//
SET @var1 := 1;
CALL anyname()//
person eisberg    schedule 12.11.2012
comment
ฉันคิดว่าเราทุกคนต้องการรายละเอียดเพิ่มเติมเกี่ยวกับเป้าหมายของคุณก่อนจึงจะสามารถให้คำตอบที่มีคุณสมบัติเหมาะสมได้ - person eisberg; 12.11.2012
comment
รายละเอียดอะไร? ฉันเริ่มคิดว่าฉันเป็นคนเดียวที่เคยใช้คำสั่งแบบมีเงื่อนไขในโหมดแบทช์ :) หากคุณต้องการข้อมูลเพิ่มเติม โปรดสอบถาม - person Mordechai; 12.11.2012
comment
นี่คือตัวอย่างหนึ่งของงานที่ฉันพบ แม้ว่าต้องการหลีกเลี่ยงหากทำได้: stackoverflow.com /คำถาม/9899663/ - person Mordechai; 12.11.2012
comment
ดังนั้นคุณไม่สามารถใส่สคริปต์ของคุณไว้ในขั้นตอนได้? - person eisberg; 13.11.2012
comment
ไม่ใช่ในกรณีนี้ ฉันจะไปกับวิธีแก้ปัญหาแปลกๆ ขอบคุณ. - person Mordechai; 13.11.2012

คุณสามารถใช้ CASE แทนได้

SET @var:=2; 
SELECT CASE WHEN @var=1 THEN 'hello' ELSE 'no hello' END;
--prints 'no hello'

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN 'hello' ELSE 'no hello' END;
--prints 'hello'

ฉันหวังว่าแนวคิดนี้จะชัดเจนด้วยตัวอย่างข้างต้น

แก้ไข: เพื่อแก้ไขข้อกังวลเพิ่มเติมของ OP คุณสามารถรวม selects ในคำสั่ง case ได้ แต่คุณควรอยู่ในวงเล็บ สำหรับเช่น

SET @var:=2; 
SELECT CASE WHEN @var:=1 THEN (select 'hello') ELSE (select 'no hello') END;

สิ่งหนึ่งที่ควรสังเกตคือควรส่งคืนค่าเดียวเท่านั้น (จากหนึ่งแถวและหนึ่งคอลัมน์)

person nawfal    schedule 12.11.2012
comment
ขอบคุณ แต่มันใช้ไม่ได้กับสิ่งที่ซับซ้อนกว่านี้เล็กน้อย เช่น: if @var=1 select *from tableX else select * frm tableY - person Mordechai; 12.11.2012
comment
@MorDeror ชอบอะไร? ฉันแน่ใจว่ามีทางออก - person nawfal; 12.11.2012
comment
@MorDeror มันก็ใช้ได้เช่นกัน ดูการแก้ไขของฉัน หากคุณกำลังบอกเราว่าคุณกำลังพยายามทำอะไรให้สำเร็จ เราก็สามารถช่วยได้ดีขึ้น - person nawfal; 12.11.2012
comment
ขอบคุณ @nawfal แต่การกลับมาเพียงหนึ่งคอลัมน์อาจไม่ครอบคลุมกรณีการใช้งานส่วนใหญ่ - person Mordechai; 12.11.2012
comment
@MorDeror ใช่มันจะไม่ครอบคลุมกรณีส่วนใหญ่ แต่คุณต้องดึงข้อมูลหลายคอลัมน์ผ่านถ้าตรรกะอื่นเป็นกลิ่นรหัส ฉันได้กลิ่นข้อบกพร่องด้านการออกแบบ ฉันขอให้คุณโพสต์ข้อกำหนดที่แท้จริงจะมีทางเลือกที่ดีกว่าเสมอ - person nawfal; 12.11.2012
comment
สำหรับฉันแล้วดูเหมือนว่าการดึงข้อมูลจากตารางบางตารางโดยมีเงื่อนไขนั้นไม่ใช่ข้อบกพร่องด้านการออกแบบที่แย่มาก :) เท่าที่สิ่งที่ฉันทำในตอนแรกคือการตรวจสอบว่ามีแถวอยู่หรือไม่ก่อนที่จะพยายามแทรก - person Mordechai; 12.11.2012
comment
@MorDeror ไม่ใช่และนั่นคือเหตุผลที่คุณมี WHERE และ CASE และ IF แต่มีไว้สำหรับวัตถุประสงค์ที่แตกต่างกัน คุณกำลังขอฟังก์ชันการทำงานของ WHERE ใน CASE หากคุณต้องการแทรกแบบมีเงื่อนไขนั่นจะเป็นสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง แต่สามารถทำได้ง่ายกว่าแฮ็กเหล่านี้ ดูลิงก์นี้สำหรับตัวอย่าง stackoverflow.com/questions/13302714/ มีลิงก์อื่น ๆ ที่คล้ายกันมากมายใน SO - person nawfal; 12.11.2012
comment
ขอบคุณ. มันแก้ปัญหาของฉันได้ แม้ว่าจะบังคับใช้ความคิดเห็นของฉันว่าไม่ควรใช้ MySQL สำหรับงาน DB จริงใดๆ :) - person Mordechai; 12.11.2012
comment
ด้วยความยินดี. ฉันยอมรับว่า MySQL ไม่ใช่สิ่งที่ดีที่สุดจริงๆ มันไม่ได้มีคุณสมบัติที่หลากหลายเลยเมื่อเทียบกับ Dbms-es อื่นๆ - มันพลาดจุดตัด ยกเว้น/ลบ ความสามารถในการหมุน ฟังก์ชันหน้าต่าง และอยู่ไกลจาก std ANSI SQL เมื่อเปรียบเทียบกับผู้เล่นหลักอื่นๆ โดยไม่ลืมสิ่งที่ไร้เหตุผลที่มันช่วยให้เราทำกับมัน จัดกลุ่มตาม แต่เหตุผลที่มันได้รับความนิยมมากก็คือว่ามันง่าย ซึ่งเป็นสิ่งที่ฉันชอบ ไม่ใช่แค่ทางวากยสัมพันธ์เท่านั้น แต่ยังไม่มีการจำกัดเราด้วยสิ่งกีดขวางบนถนนอีกด้วย - person nawfal; 12.11.2012