您可以使用 COALESCE() 函数 或 CASE WHEN 表达式来处理这个逻辑:
方案一:使用 COALESCE() 函数(推荐)
sql
SELECT
bpi.batch_id AS batchId,
bpi.batch_name AS batchName,
bpi.plate_name AS plateName,
bpi.category AS productType,
bpi.product_id AS productId,
bpi.product_name AS productName,
bpi.opening_time AS openingTime,
bpi.section_id AS sectionId,
bpi.section_name AS sectionName,
bpi.company_id AS companyId,
bpi.company_name AS supplier,
bpi.purchase_type AS purchaseType,
COALESCE(bpi.winning_bid_amount, bpi.bid_price) AS winningBidAmount
FROM bid_project_info bpi
方案二:使用 CASE WHEN 表达式
sql
SELECT
bpi.batch_id AS batchId,
bpi.batch_name AS batchName,
bpi.plate_name AS plateName,
bpi.category AS productType,
bpi.product_id AS productId,
bpi.product_name AS productName,
bpi.opening_time AS openingTime,
bpi.section_id AS sectionId,
bpi.section_name AS sectionName,
bpi.company_id AS companyId,
bpi.company_name AS supplier,
bpi.purchase_type AS purchaseType,
CASE
WHEN bpi.winning_bid_amount IS NULL THEN bpi.bid_price
ELSE bpi.winning_bid_amount
END AS winningBidAmount
FROM bid_project_info bpi
方案三:使用 IFNULL() 函数(MySQL、SQLite等)
sql
SELECT
bpi.batch_id AS batchId,
bpi.batch_name AS batchName,
bpi.plate_name AS plateName,
bpi.category AS productType,
bpi.product_id AS productId,
bpi.product_name AS productName,
bpi.opening_time AS openingTime,
bpi.section_id AS sectionId,
bpi.section_name AS sectionName,
bpi.company_id AS companyId,
bpi.company_name AS supplier,
bpi.purchase_type AS purchaseType,
IFNULL(bpi.winning_bid_amount, bpi.bid_price) AS winningBidAmount
FROM bid_project_info bpi
方案四:使用 ISNULL() 函数(SQL Server)
sql
SELECT
bpi.batch_id AS batchId,
bpi.batch_name AS batchName,
bpi.plate_name AS plateName,
bpi.category AS productType,
bpi.product_id AS productId,
bpi.product_name AS productName,
bpi.opening_time AS openingTime,
bpi.section_id AS sectionId,
bpi.section_name AS sectionName,
bpi.company_id AS companyId,
bpi.company_name AS supplier,
bpi.purchase_type AS purchaseType,
ISNULL(bpi.winning_bid_amount, bpi.bid_price) AS winningBidAmount
FROM bid_project_info bpi
📌 各方案对比
| 方案 | 函数 | 适用数据库 | 特点 |
|---|---|---|---|
| 方案一 | COALESCE() |
所有主流数据库(标准SQL) | 最通用,可处理多个参数,返回第一个非NULL值 |
| 方案二 | CASE WHEN |
所有数据库 | 最灵活,可处理复杂条件 |
| 方案三 | IFNULL() |
MySQL、SQLite、MariaDB | 简洁,但只适用于特定数据库 |
| 方案四 | ISNULL() |
SQL Server | SQL Server专用 |
💡 推荐与说明
推荐使用方案一的 COALESCE() 函数,原因如下:
-
标准化 :
COALESCE()是 SQL 标准函数,在所有主流数据库(MySQL、PostgreSQL、Oracle、SQL Server、SQLite等)中都可用 -
可扩展性 :可以处理多个字段的优先级,例如:
sqlCOALESCE(bpi.winning_bid_amount, bpi.bid_price, bpi.estimate_price, 0) AS winningBidAmount(依次尝试 winning_bid_amount、bid_price、estimate_price,都为空则返回 0)
-
简洁性 :代码比
CASE WHEN更简洁
🔍 完整查询示例
sql
SELECT
bpi.batch_id AS batchId,
bpi.batch_name AS batchName,
bpi.plate_name AS plateName,
bpi.category AS productType,
bpi.product_id AS productId,
bpi.product_name AS productName,
bpi.opening_time AS openingTime,
bpi.section_id AS sectionId,
bpi.section_name AS sectionName,
bpi.company_id AS companyId,
bpi.company_name AS supplier,
bpi.purchase_type AS purchaseType,
-- 如果winning_bid_amount为空,则使用bid_price
COALESCE(bpi.winning_bid_amount, bpi.bid_price) AS winningBidAmount
FROM bid_project_info bpi
WHERE ... -- 可以添加其他查询条件
ORDER BY ... -- 可以添加排序
⚠️ 注意事项
-
确保
bid_price字段存在于bid_project_info表中 -
如果
bid_price也可能为 NULL,可以使用嵌套的COALESCE()或设置默认值:sqlCOALESCE(bpi.winning_bid_amount, bpi.bid_price, 0) AS winningBidAmount -
数据类型要兼容:
winning_bid_amount和bid_price应该是相同或兼容的数据类型(如都是 DECIMAL、FLOAT 等)