如何在SQLite中按逗号将地址字段拆分为三个独立列
地址字段拆分三列SQL解决方案
你现有代码仅拆分了第一个逗号的前后内容,因此只能得到前两列,要获取第三列州缩写,需要定位到第二个逗号的位置做二次截取,以下是两种可直接使用的实现方案:
方案1:兼容INSTR函数的通用写法(适配MySQL、Oracle、SQLite 3.34.0+等)
通过嵌套INSTR函数定位第二个逗号的位置,完成三段截取,额外添加TRIM函数去除分割后内容前后的多余空格:
SELECT -- 截取第一个逗号前的街道信息 TRIM(SUBSTRING(OwnerAddress, 1, INSTR(OwnerAddress, ',') - 1)) AS address_street, -- 截取两个逗号中间的城市信息 TRIM(SUBSTRING( OwnerAddress, INSTR(OwnerAddress, ',') + 1, INSTR(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), ',') - 1 )) AS address_city, -- 截取第二个逗号后的州缩写信息 TRIM(SUBSTRING( OwnerAddress, INSTR(OwnerAddress, ',') + INSTR(SUBSTRING(OwnerAddress, INSTR(OwnerAddress, ',') + 1), ',') + 1 )) AS address_state FROM housing_data;
方案2:支持SUBSTRING_INDEX的简化写法(适配MySQL)
使用SUBSTRING_INDEX函数可以大幅简化截取逻辑,代码可读性更高:
SELECT TRIM(SUBSTRING_INDEX(OwnerAddress, ',', 1)) AS address_street, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(OwnerAddress, ',', 2), ',', -1)) AS address_city, TRIM(SUBSTRING_INDEX(OwnerAddress, ',', -1)) AS address_state FROM housing_data;
SUBSTRING_INDEX参数规则:第二个参数为分隔符,第三个参数为正数时取第N个分隔符前的所有内容,为负数时取倒数第N个分隔符后的所有内容。
注意事项
- 两种方案均默认所有地址为「街道,城市,州」的标准三段结构,且恰好有2个逗号作为分隔符,若存在格式不规范的地址可额外加判断逻辑避免取值报错
- 其他数据库适配参考:PostgreSQL可使用
STRING_TO_ARRAY(OwnerAddress, ',')转数组后按下标取值,SQL Server可使用STRING_SPLIT配合排序后取值
内容的提问来源于stack exchange,提问作者Alastair Thomson
相关产品推荐
相关产品推荐

