SQL双表条件查询报错:如何实现交付日期的兜底取值?
问题解决方法
错误原因
- SQL语法不存在
SELECT ... ELSE ...的分支写法,这种逻辑不符合SQL规范 {Contract}这类占位符格式不合法,不同数据库有专属参数规范(比如SQL Server用@Contract,MySQL可用?或@Contract)
可行解决方案
方法1:LEFT JOIN + COALESCE(推荐,单次查询完成)
通过关联两张表,利用COALESCE函数优先取POS_SCH的日期,无数据时自动使用POH_HFM的日期:
SELECT COALESCE(ps.POS_DELIVERY_DATE, ph.POH_DEL_DATE) AS DELIVERY_DATE FROM POH_HFM ph LEFT JOIN POS_SCH ps ON ps.POS_CONTRACT = ph.POH_CONTRACT AND ps.POS_ORDER = ph.POH_ORDER AND ps.POS_LINE = @Line -- 替换为对应数据库的参数格式,比如@Line或? WHERE ph.POH_CONTRACT = @Contract -- 替换为@Contract或? AND ph.POH_ORDER = @Order; -- 替换为@Order或?
方法2:条件判断分查询
如果数据库支持IF EXISTS(如SQL Server、MySQL),可通过判断POS_SCH是否存在数据,执行不同查询:
-- SQL Server版本 IF EXISTS (SELECT 1 FROM POS_SCH WHERE POS_CONTRACT = @Contract AND POS_ORDER = @Order AND POS_LINE = @Line) BEGIN SELECT POS_DELIVERY_DATE AS DELIVERY_DATE FROM POS_SCH WHERE POS_CONTRACT = @Contract AND POS_ORDER = @Order AND POS_LINE = @Line END ELSE BEGIN SELECT POH_DEL_DATE AS DELIVERY_DATE FROM POH_HFM WHERE POH_CONTRACT = @Contract AND POH_ORDER = @Order END
注:MySQL需调整为IF EXISTS (...) THEN ... ELSE ... END IF;的语法格式,参数同步适配对应规范
内容的提问来源于stack exchange,提问作者Diane King
相关产品推荐
相关产品推荐

