Oracle SQL CASE语句查询双语人名结果异常,求排查原因
问题分析与修复方案
核心问题
- 大小写匹配错误:你的SQL里用
'Global'去匹配name_type,但根据描述表中该字段存储的是全大写的'GLOBAL'。Oracle等数据库默认字符串匹配是大小写敏感的,所以完全匹配不上,导致english name列全为空。 - 非目标类型行返回NULL:当行的
name_type既不是SA也不是GLOBAL时,CASE语句没有对应的匹配分支,会默认返回NULL,这就是arabic name列存在部分空值的原因。
修复后的SQL
方案1:消除大小写影响(推荐)
用UPPER()或LOWER()统一转换后匹配,避免因存储的大小写不一致导致的问题:
SELECT rownum, CASE UPPER(name_type) WHEN 'GLOBAL' THEN full_name END AS "english name", CASE UPPER(name_type) WHEN 'SA' THEN full_name END AS "arabic name" FROM per_person_names_f
方案2:直接匹配正确大小写
如果确认表中name_type的存储值是固定全大写,也可以直接修正匹配字符串:
SELECT rownum, CASE name_type WHEN 'GLOBAL' THEN full_name END AS "english name", CASE name_type WHEN 'SA' THEN full_name END AS "arabic name" FROM per_person_names_f
进阶优化:合并同一人双语名称到一行
如果你的表中同一人物的英语、阿拉伯语名称是分开存储的两行,想要合并到同一行展示,可以用聚合函数配合分组(假设存在唯一标识人物的列,比如person_id):
SELECT person_id, MAX(CASE UPPER(name_type) WHEN 'GLOBAL' THEN full_name END) AS "english name", MAX(CASE UPPER(name_type) WHEN 'SA' THEN full_name END) AS "arabic name" FROM per_person_names_f GROUP BY person_id
内容的提问来源于stack exchange,提问作者aasem shoshari
相关产品推荐
相关产品推荐

