SQL查询PO号时LEGACY_PO_NUMBER返回'?'无法替换为空值求助
问题原因
你的CASE逻辑本身语法是正确的,没有生效基本是以下两种原因:
REFERENCE_NBR字段中存储的?前后带有不可见字符,比如空格、制表符、换行符、全角空格等,导致精确匹配'?'时匹配失败- 存储的是全角问号
?,和你匹配的半角问号?不一致,也会出现匹配失效的情况
解决方案
方案1:先去除首尾空白再匹配(最常用)
先通过TRIM函数去除字段首尾的空白字符后再做匹配,修改后的逻辑如下:
REPLACE (PO_PO.PO_NUMBER,',','') AS PO_NUMBER, (CASE WHEN TRIM(PO_PO_DETAILS.REFERENCE_NBR) IS NULL THEN '' WHEN TRIM(PO_PO_DETAILS.REFERENCE_NBR) = '?' THEN '' ELSE PO_PO_DETAILS.REFERENCE_NBR END) AS LEGACY_PO_NUMBER
方案2:简化写法(适配绝大多数数据库)
可以用NULLIF+COALESCE的组合简化逻辑,代码更简洁易读:
REPLACE (PO_PO.PO_NUMBER,',','') AS PO_NUMBER, COALESCE(NULLIF(TRIM(PO_PO_DETAILS.REFERENCE_NBR), '?'), '') AS LEGACY_PO_NUMBER
验证排查方法
如果以上方案还是不生效,可以先执行以下查询确认异常值的具体情况:
SELECT REFERENCE_NBR, LENGTH(REFERENCE_NBR), ASCII(REFERENCE_NBR) FROM PO_PO_DETAILS WHERE PO_NUMBER = '8173063'
通过长度和ASCII码就能确定?前后是否有其他隐藏字符,或者是不是全角问号,再调整匹配条件即可。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

