怎么从地址里面截取这种字符长度不固定的城市?

image.png

FineReport 胡桂丹 发布于 2022-3-22 11:26
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
胡桂丹Lv5初级互助
发布于2022-3-22 17:54

分别截取省份城市,但是省份和省市的字符长度都不是固定的,比如新疆地区,有的地区是直辖市没有省份,最后

with t as (

    select '广东省珠海市博弈县'  str

    union

    select '广西唯物自治区淮海市南部镇' str

)

select str,

       case when locate('省',str) then substr(str,1,locate('省',str))

        else substr(str,1,locate('自治区',str)+2) end 省份,

       case when locate('省',str) then substr(str,locate('省',str)+1,locate('市',str)-locate('省',str))

        else substr(str,locate('自治区',str)+3,locate('市',str)-locate('自治区',str)-2) end 城市

from t;

最佳回答
0
CD20160914Lv8专家互助
发布于2022-3-22 11:28(编辑于 2022-3-22 17:50)

这种的话建立还是弄个对照表吧。你红色方框的说真的有点麻烦了。。。

有市的可以判断。有一些有前面有区。后面带市,你要把区与市一起截取。。这个真要你弄个参照表了。。

表设计得不规则没有遵守建表的三范式,,,比如省,区  县,,市,街道这种 数据应该分层次存放。而不是直接填写在一列中。。

比如你在手机淘宝,或者京东上新建地址的时候,人家都会让你选择省,,然后市,然后区,最后填写一个街道的详细地址,人家就是为了方便保存为多列数据。。这样才是建表的规范。

最佳回答
0
lbstjwLv7初级互助
发布于2022-3-22 17:45(编辑于 2022-3-22 17:54)

没错,有个参照表也是个解决办法,但是总有新的条目进来的时候没有参照,也识别不了就特殊处理,还好城市名是固定的,参照表就弄个本地区所有城市名称。

最好有个规范,在规范在基础上再进行操作,个别有问题的单独处理这样的思路。

具体思路就是,先判断前几个字符是字之前的去掉,后面几个字符遇到的去掉。

若两个都能找到,那正常截取就行了。

若能找到区字,找不到字,就规定截取字后面比如10个字。

若能找到市字,找不到字,就规定截取字前面比如10个字。

若两个都找不到,就规定从第八个字开始截取,比如10个字。

(因为10个字的城市名基本很少有,然后把10个字进行模糊匹配)

然后把所有10个字的字段跟本地区所有城市名进行模糊匹配并新增列为匹配正常的城市名称。

这是我的个人想法。

  • 2关注人数
  • 343浏览人数
  • 最后回答于:2022-3-22 17:54
    请选择关闭问题的原因
    确定 取消
    返回顶部