ฉันจะใช้ค่าเริ่มต้นในแบบสอบถามแบบใช้เลือกข้อมูลใน PostgreSQL ได้อย่างไร


32

ฉันต้องการใช้ค่าเริ่มต้นสำหรับคอลัมน์ที่ควรใช้หากไม่มีการส่งคืนแถว เป็นไปได้ใน PostgreSQL? ฉันจะทำมันได้อย่างไร หรือมีวิธีอื่นที่ฉันสามารถแก้ไขได้?

เช่นบางสิ่งเช่นนี้

SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3

และถ้าไม่มีแถวที่มีในตารางผมต้องการที่จะกลับมาorg_id = 30

คำตอบ:


42
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3

หรือ

SELECT case count(*) when 0 then 0 else MAX(post_id) end AS max_id
FROM my_table 
WHERE org_id = 3;

ถ้าคุณต้องการให้ max (post_id) เป็นnullเมื่อมี 1 แถว แต่ post_id เป็นโมฆะ

dbfiddle


13

หากคุณต้องการแสดง0(อนิจจา 1 แถว) เมื่อคิวรีของคุณส่งคืน 0 แถวคุณสามารถใช้:

SELECT COALESCE( 
        ( SELECT MAX(post_id) FROM my_table WHERE org_id = 3 )
               , 0) AS max_id

7
SELECT 
  coalesce(MAX(post_id),0) AS max_id 
FROM 
  my_table 
WHERE 
  org_id = 3 

ด้านบนไม่ทำงานหากคุณต้องการใช้ชื่อเริ่มต้นสำหรับเขตข้อมูลชื่อและจะใช้งานได้เฉพาะเมื่อคุณใช้ฟิลด์หมายเลข แบบสอบถามด้านล่างใช้ได้กับฟิลด์ทุกประเภท ..

SELECT 
  COALESCE(
   (SELECT column_name FROM my_table WHERE id = -1), 
   'default_value'
  ) AS column_name;

2

ฉันไม่สามารถทำงานได้ทั้งสองอย่าง

นี่คือสิ่งที่ฉันพบว่าทำงานได้สำหรับสิ่งนี้:

SELECT COALESCE(A.max_id, B.dflt) FROM (
SELECT MAX(post_id) AS max_id FROM my_table WHERE org_id = 3) A
       RIGHT OUTER JOIN (SELECT 0 AS dflt) B
       ON 1 = 1

ฉันรู้ว่าไม่ได้เป็นทางออกที่สวยงาม แต่ทำงานได้


1
SELECT coalesce(MAX(post_id),0) AS max_id FROM my_table WHERE org_id = 3ทำงานได้ดีสำหรับฉัน
Jonas

2
@ mmandk9 คุณสามารถอธิบายรายละเอียดเกี่ยวกับ "ไม่ทำงาน" - คุณเป็นรุ่น Postgres รุ่นใดและคุณได้รับข้อความแสดงข้อผิดพลาดอะไรบ้าง (ถ้ามี)
แจ็คดักลาส

-2

เพียงแค่คืนค่าเริ่มต้นหากไม่พบแถว:

SELECT IFNULL(s_stock, 5)
  FROM stock_info 
 WHERE s_product_id = '43';

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