SQL查询同时返回BILL_OF_LADING非空及含SHQ记录并提取发货数量
问题根因
SQL中逻辑运算符AND的优先级高于OR,你原有写法的WHERE条件实际执行逻辑为:
(PO_NUMBER = '1234567' AND BILL_OF_LADING IS NOT NULL)
OR
(AUDIT_TRAIL_VERBAGE LIKE 'SHQ%')
这会导致所有满足AUDIT_TRAIL_VERBAGE以SHQ开头的行都被返回,哪怕PO号不匹配,和你的预期逻辑不符。
修正方案
1. 修复WHERE筛选逻辑
给OR关联的两个条件加括号,确保先判定PO号匹配,再筛选行类型:
SELECT PO_NUMBER, AUDIT_TRAIL_VERBAGE, BILL_OF_LADING FROM MY.TABLE WHERE PO_NUMBER = '1234567' -- 单值匹配用=更简洁,多值匹配场景再用IN AND ( BILL_OF_LADING IS NOT NULL OR AUDIT_TRAIL_VERBAGE LIKE 'SHQ%' )
2. 提取SHQ后5位发货数量+同PO合并返回
如果需要把同一个PO的提单号、发货数量合并为一行返回,可以配合CASE和聚合函数实现:
SELECT PO_NUMBER, -- 提取提单号 MAX(CASE WHEN BILL_OF_LADING IS NOT NULL THEN BILL_OF_LADING END) AS BILL_OF_LADING, -- 提取SHQ后5位数字,SHQ加空格占前4位,从第5位开始取5位 MAX(CASE WHEN AUDIT_TRAIL_VERBAGE LIKE 'SHQ%' THEN SUBSTRING(AUDIT_TRAIL_VERBAGE, 5, 5) END) AS SHIP_QUANTITY FROM MY.TABLE WHERE PO_NUMBER = '1234567' AND ( BILL_OF_LADING IS NOT NULL OR AUDIT_TRAIL_VERBAGE LIKE 'SHQ%' ) GROUP BY PO_NUMBER
注:如果使用Oracle数据库,将
SUBSTRING替换为SUBSTR即可。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

