วิธีรับค่าสูงสุดสองค่าใน MySQL?


290

ฉันพยายาม แต่ล้มเหลว:

mysql> select max(1,0);
ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือ
ที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อใช้ไวยากรณ์ที่ถูกต้อง 
ใกล้ '0)' ที่บรรทัด 1

คำตอบ:


528

ใช้สุดยอด ()

เช่น:

SELECT GREATEST(2,1);

หมายเหตุ: เมื่อใดก็ตามที่หากค่าเดียวใด ๆ มีค่า null ในเวลานั้นฟังก์ชันนี้จะส่งกลับค่าว่างเสมอ (ขอบคุณ user @ sanghavi7)


41
สิ่งหนึ่งที่ต้องจำไว้เสมอว่าเมื่อใดก็ตามที่หากค่าใด ๆ ที่มีค่าเป็นโมฆะในเวลานั้นฟังก์ชั่นนี้จะคืนค่า NULL เป็นคำตอบเสมอ!
sanghavi7

33
นอกจากนี้ยังมีLEAST
bobobobo

1
ฉันจะเรียกใช้แบบสอบถามย่อยเป็นพารามิเตอร์GREATESTเพื่อที่ฉันจะได้รับค่าสำหรับคอลัมน์ cirtain
23411 Junaid Qadir

17
เพื่อป้องกันปัญหาด้วยโมฆะคุณสามารถใช้ ifnull เช่นselect greatest(date1, ifnull(date2, "0000-00-00 00.00:00")) from table1 where date2 is null;คุณจะได้รับ date1
Christoph Grimmer-Dietrich

1
หากค่าบางอย่างอาจเป็นโมฆะคุณสามารถทำได้GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean

27

ในการรับค่าสูงสุดของคอลัมน์ในชุดของแถว:

SELECT MAX(column1) FROM table; -- expect one result

ในการรับค่าสูงสุดของชุดของคอลัมน์ตัวอักษรหรือตัวแปรสำหรับแต่ละแถว:

SELECT GREATEST(column1, 1, 0, @val) FROM table; -- expect many results

3
ระวังค่า null GREATESTกับ ค่า Null ใด ๆ จะทำให้ฟังก์ชันส่งคืนค่า Null เพื่อป้องกันสิ่งนี้คุณสามารถทำได้GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean

5

คุณสามารถใช้ยิ่งใหญ่ฟังก์ชั่นที่มีเขตข้อมูลไม่ nullable หากหนึ่งในค่านี้ (หรือทั้งสองอย่าง) สามารถเป็น NULL ได้อย่าใช้มัน (ผลลัพธ์อาจเป็น NULL)

select 
    if(
        fieldA is NULL, 
        if(fieldB is NULL, NULL, fieldB), /* second NULL is default value */
        if(fieldB is NULL, field A, GREATEST(fieldA, fieldB))
    ) as maxValue

คุณสามารถเปลี่ยน NULL ให้เป็นค่าเริ่มต้นที่คุณต้องการ (ถ้าค่าทั้งสองเป็น NULL)


1
นี่คือเหตุผลที่ฉันเกลียด MySQL อย่างสุจริต ช่างเป็นงานที่ทำสิ่งง่าย ๆ จำนวนมหาศาล
โมนิก้า Heddneck

9
select COALESCE(GREATEST(fieldA, fieldB),fieldA,fieldB) as maxValueนี้สามารถถูกแทนที่เพียงกับ มันซับซ้อนมากเกินไป
Kyborek

1
หากค่าบางอย่างอาจเป็นโมฆะคุณสามารถทำได้GREATEST(COALESCE(column1, 0), COALESCE(column2, 0))
Sean the Bean
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.