คำสั่ง 'IF' ใน 'เลือก' - เลือกค่าผลลัพธ์ตามค่าคอลัมน์


685
SELECT id, amount FROM report

ฉันต้องการamountที่จะเป็นamountถ้าreport.type='P'และถ้า-amount report.type='N'ฉันจะเพิ่มสิ่งนี้ลงในข้อความค้นหาด้านบนได้อย่างไร

คำตอบ:


1025
SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

ดูhttp://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

นอกจากนี้คุณสามารถจัดการเมื่อเงื่อนไขเป็นโมฆะ ในกรณีที่มีค่าเป็นศูนย์:

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

ส่วนIFNULL(amount,0)วิธีการเมื่อปริมาณไม่ได้เป็นจำนวนเงินผลตอบแทน null อื่น return 0


5
ฉันสงสัยว่ามีประโยชน์ใด ๆ ในการใช้ IFNULL นี้แทน COALESCE ที่นี่หรือไม่
Chris

4
จากแหล่ง mysql ฉันสังเกตเห็นคำจำกัดความของการรวมตัวกัน 2 คำนิยามหนึ่งมี 2 ข้อโต้แย้งและอีกรายการที่มีรายการข้อโต้แย้ง แต่ ifnull จะเรียกใช้การรวมกันพร้อมกับพารามิเตอร์ 2 ตัวsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
คำตอบนั้นไม่ถูกต้องหากมีประเภทรายงานที่แตกต่างจาก 'N' และ 'P' โปรดดูความคิดเห็นของ BadHorsie ในโซลูชัน "คำสั่งกรณี" ที่ดีกว่า
Trygve

3
@Trygve คำถามสำหรับ 2 เงื่อนไขและมองหาIFคำสั่งมีอะไรผิดปกติ?
Felipe Buccioni

2
@Felipe คำตอบไม่จำเป็นต้องถูกต้อง 100% อาจมีประเภทรายงานอื่นที่ไม่ใช่ N และ P ในกรณีของคุณอาจทำให้เกิดข้อผิดพลาดโดยเลือก - จำนวนหากประเภทรายงาน (เป็นตัวอย่าง) คือ 'E' คำถามล้มเหลวในการพูดถึงหากมีประเภทรายงานอื่น ๆ ดังนั้นฉันจึงลบ downvote ของฉัน ฉันชอบที่จะตั้งโปรแกรมป้องกันในกรณีเหล่านี้ดังนั้นจึงมุ่งหน้าไปยังผู้อ่านคนอื่น
Trygve

255

ใช้caseคำสั่ง:

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

5
@Evan: จริง ฉันใช้มันเพื่อความชัดเจน ไม่ว่าจะส่งผลกระทบอะไรเลยล่ะค่ะ
mellamokb

3
ฉันชอบไวยากรณ์มาตรฐาน ANSI มากกว่าไวยากรณ์ที่กำหนดเองสำหรับฐานข้อมูลเฉพาะ
Gordon Linoff

2
นี่เป็นทางออกที่ดีที่สุดเพราะโซลูชันคำตอบที่ยอมรับนั้นไม่เหมาะสมถ้ามีค่าอื่นสำหรับ report.type หรือถ้ามีการนำรายงาน report.type ใหม่มาใช้ในภายหลัง if report.type = 'P' use amount, otherwise use -amount for anything elseมันบอกว่า มันจะไม่พิจารณาประเภทหากไม่ใช่ 'P'
BadHorsie

97
SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;


15

ส่วนใหญ่วิธีที่ง่ายที่สุดคือการใช้IF () ใช่ Mysql อนุญาตให้คุณใช้ตรรกะตามเงื่อนไข ถ้าฟังก์ชั่นใช้เวลา 3 พารามิเตอร์เงื่อนไข TRUE OUTCOME, FALSE OUTCOME

ดังนั้นลอจิกคือ

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

SQL

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

คุณสามารถข้าม abs () หากไม่มีทั้งหมดอยู่ใน + เท่านั้น


12
SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

เนื่องจากชุดผลลัพธ์นั้นไม่เหมือนกันฉันชอบ UNION ALL ที่นี่
Arth

4

คุณสามารถลองสิ่งนี้ได้เช่นกัน

 SELECT id , IF(type='p', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount FROM table
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.