MySQL ถ้าไม่เป็นโมฆะจากนั้นแสดง 1 มิฉะนั้นจะแสดง 0


105

ฉันกำลังทำงานกับความซับซ้อนในการแสดงผลเล็กน้อยที่นี่ ฉันแน่ใจว่ามีความสามารถ IF / ELSE ที่ฉันมองข้ามไป

ฉันมี 2 ตารางที่ฉันกำลังสอบถาม (ลูกค้าที่อยู่) รายการแรกมีระเบียนหลัก แต่รายการที่สองอาจมีหรือไม่มีบันทึกเพื่อ LEFT JOIN ถึง

ฉันต้องการแสดงค่าศูนย์หากไม่มีบันทึกในตารางที่อยู่ และฉันต้องการแสดงเฉพาะ 1 ถ้ามีระเบียนอยู่

สิ่งที่ฉันพยายามจนถึงตอนนี้:

SELECT c.name, COALESCE(a.addressid,0) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123

ตัวอย่างแรกนี้ไม่ได้ทำ แต่ฉันอาจใช้ COALESCE ผิด

ฉันจะแสดง 0 ถ้าว่างและ 1 ได้อย่างไรถ้ามีอยู่


เป็นไปได้ที่จะซ้ำกันของSQL กรณีเงื่อนไขไม่เป็นโมฆะ
nawfal

คำตอบ:


212

แทนที่จะCOALESCE(a.addressid,0) AS addressexistsใช้CASE:

CASE WHEN a.addressid IS NOT NULL 
       THEN 1
       ELSE 0
END AS addressexists

หรือง่ายกว่า:

(a.addressid IS NOT NULL) AS addressexists

งานนี้เพราะTRUEจะแสดงเป็น1ใน MySQL และเป็นFALSE0



17

ระวังถ้าคุณมาจาก C / C ++ และคาดหวังว่าสิ่งนี้จะใช้งานได้:

select if(name, 1, 0) ..

แม้ว่า 'name' จะไม่ใช่ NULL ซึ่งแตกต่างจากใน C แต่เงื่อนไขที่เป็นเท็จก็ยังคงทริกเกอร์และข้อความข้างต้นจะส่งกลับ 0 ดังนั้นคุณต้องอย่าลืมตรวจสอบ NULL หรือสตริงว่างอย่างชัดเจน:

 select if(name is null or name = '', 0, 1)

ตัวอย่างของ PS Eugen ข้างบนนั้นถูกต้องแต่ฉันต้องการชี้แจงความแตกต่างเล็กน้อยนี้เพราะมันทำให้ฉันประหลาดใจ



2

อีกวิธีที่ไม่มีที่ไหนลองทำดู ..

จะเลือกทั้งค่าว่างและค่า NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

มันจะตั้งค่าว่างถ้าเป็นสตริงว่างจากนั้นให้เป็นจริงด้วย


มีประโยชน์ด้วย: เลือก IFNULL (ชื่อฟิลด์ "1") จาก tablename;
PodTech.io

1

คุณสามารถใช้คำสั่ง IF ใน MySQL เวอร์ชันล่าสุดได้

IF(expr,if_true_expr,if_false_expr)

IE:

SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors

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