sql server截取某个特定字符后的字符串

sql server截取某个特定字符前,特定字符后,特定字符之间的字符串

怎么分别截取第一个”—“之前的数,第二个”—“之后的数和两个”—“之间的数啊
注意我是sql server的

img

截取第一个”—“之前的数,我百度到的是这样的,可以用,但是第二个”—“之后的数和两个”—“之间的数这俩不会截取,截取的都不太对

select  left(adress,charindex('-',adress)-1) from aaa where charindex('-',adress)-1 > 0

可以直接试一下这段逻辑,运气好的话,可以直接满足需求,如果和预期有出入,可以接着往下看每一步的解析,主要我这边没有sql server的环境,没法进行测试,所以只能凭借对这些函数的理解写一段逻辑,所以这里可能会出现一些不准确的地方,您可以在自己理解后尝试改一改逻辑,基本框架应该就是这样

select substr(adress,1,CHARINDEX('-',adress,1)), --第一个”—“之前的数
substr(adress,CHARINDEX('-',adress,1),CHARINDEX('-',adress,CHARINDEX('-',adress,1)+1)),--两个”—“之间的数
substr(adress,CHARINDEX('-',adress,CHARINDEX('-',adress,1)+1),-1) --第二个”—“之后的数

首先需要了解的是substr和CHARINDEX两个函数,substr是对一个字段,截取指定位数之间的字符,比如substr(adress,1,2)就是从第1位开始,截取2位字符,CHARINDEX函数是对一个字符找到指定字符所在的位置,比如CHARINDEX('-',adress,1)就表示在adress这个字段里,从第1位开始找,第一个'-'会在第几位出现,也就是说这个函数会返回一个数字,所以您的这个需求,就需要综合使用这两个函数。
1.因为CHARINDEX('-',adress,1)这个表达式会返回第一个'-'出现的位置,所以substr(adress,1,CHARINDEX('-',adress,1))就会得到第一个”—“之前的数
2.CHARINDEX('-',adress,CHARINDEX('-',adress,1)+1)是会返回第2个'-'出现的位置,所以substr(adress,CHARINDEX('-',adress,1),CHARINDEX('-',adress,CHARINDEX('-',adress,1)+1))就会得到两个”—“之间的数
3.理解了1、2,那也就可以捋明白substr(adress,CHARINDEX('-',adress,CHARINDEX('-',adress,1)+1),-1)这一句会的到第二个”—“之后的数