执行多条件CASE语句报错,求TENANT_NAICS字段分类解决方案
问题根源
你遇到的报错是因为tr.TENANT_NAICS里存在非数字开头的记录(比如值以'Bu'开头),直接用left(...)::numeric强制转数字时,非数字字符无法被识别,导致报错。
解决思路
先从TENANT_NAICS里精准提取开头的数字部分,再针对数字进行分类判断,同时处理非数字开头的情况:
- 用正则匹配提取字段开头的所有连续数字,避免固定长度截取的局限性
- 先判断提取到的数字是否有效,再进行分类
- 按照你的示例需求,把54开头的NAICS编码统一归为"Other Computer Related"
修改后的SQL语句
select tr.OCCUPANCY_DATE, tr.END_DATE, tr.TENANT_NAICS, pr.PROPERTY_STATUS, pr.NRA_BUILDING, pr.MARKET, pr.SUBMARKET, pr.FULL_ADDRESS_ONE_LINE, pr.LEGAL_OWNER, pr.TRUE_OWNER, lr.LESSOR_SUBLESSOR, -- 修复后的分类逻辑 case -- 匹配54开头的所有NAICS编码,对应示例需求 when substring(tr.TENANT_NAICS from '^(\d+)') ~ '^54' then 'Other Computer Related' when substring(tr.TENANT_NAICS from '^(\d+)')::numeric = 11 then 'Mining' when substring(tr.TENANT_NAICS from '^(\d+)')::numeric = 21 then 'Mining' when substring(tr.TENANT_NAICS from '^(\d+)')::numeric = 4821 then 'Construction' -- 处理非数字开头的记录,可根据需求调整显示内容 when substring(tr.TENANT_NAICS from '^(\d+)') is null or substring(tr.TENANT_NAICS from '^(\d+)') = '' then '其他行业' -- 未匹配到规则的编码,保留原字段值 else tr.TENANT_NAICS end as "Tenant Industry" from space.tran tr left join property pr on tr.ID = pr.ID left join lease lr on tr.OID = lr.OID where tr.STATUS = 'Existing' and tr.MARKET = 'Seattle';
关键细节说明
substring(tr.TENANT_NAICS from '^(\d+)'):用正则匹配字段开头的所有连续数字,比如从"543330- Other Computer Related"里提取出"543330",非数字开头的内容会提取出空字符串- 优先判断54开头的编码,完全匹配你给出的示例转换需求
- 新增非数字开头的处理分支,彻底避免转换报错,你可以根据实际业务调整"其他行业"的显示内容
- 如果使用MySQL数据库,正则语法需调整:把
substring(...) from '^(\d+)'替换为regexp_substr(tr.TENANT_NAICS, '^[0-9]+')
内容的提问来源于stack exchange,提问作者wigglesthe3rd
相关产品推荐
相关产品推荐

