注册 登录
编程论坛 VFP论坛

SQLSERVER 如何从右边取特定字符之后的字符

radiofan 发布于 2021-04-29 11:06, 2813 次点击
比如:"F/G/R/E/T/E/S/T/",如何取出右边第一个/前的T字符?字符值是未知的,不确定,只能以特定分隔符/为依据!

总的字符串长度不固定,分隔符内的字符个数也不固定(比如这里的T可能是TT或者TA等等),不变的只有‘/’,只能用sqlserve ……

[此贴子已经被作者于2021-4-29 12:42编辑过]

16 回复
#2
XUFN2021-04-29 11:17
可以尝试先用函数 AT("/","F/G/R/E/T/E/S/T/",8) 确定该字符后的"/"位置,然后再用SUBS截取.
#3
sdta2021-04-29 11:18
VFP的ALINES()行吗
#4
sdta2021-04-29 11:22
关键是字符串长度是否固定,格式是否固定。
如果格式是固定的
a = "F/G/R/E/T/E/S/T/"
? STREXTRACT(a, "/", "/", 7)

不同情况处理的方法是不一样的

[此贴子已经被作者于2021-4-29 11:26编辑过]

#5
radiofan2021-04-29 12:22
长度不固定,分隔符内的字符个数也不固定,不变的只有‘/’,只能用sqlserve ……
#6
mywisdom882021-04-29 12:26
这样不就出来了吗
a1 = "F/G/R/E/T/E/S/T/"
?substr(a1,rat("/",a1)-1,1)
#7
radiofan2021-04-29 12:40
以下是引用mywisdom88在2021-4-29 12:26:53的发言:

这样不就出来了吗
a1 = "F/G/R/E/T/E/S/T/"
?substr(a1,rat("/",a1)-1,1)


只能用sqlserve
#8
sdta2021-04-29 12:41
以下是引用radiofan在2021-4-29 12:22:24的发言:

长度不固定,分隔符内的字符个数也不固定,不变的只有‘/’,只能用sqlserve ……

? ALINES(la, "F/G/R/E/T/E/S/T/", 5, "/")
LIST MEMORY LIKE la
?la[ALEN(la, 1)]
#9
吹水佬2021-04-29 12:43
? JUSTFNAME(JUSTPATH("F/G/R/E/T/E/S/T/"))
#10
mywisdom882021-04-29 12:48
以下是引用radiofan在2021-4-29 12:22:24的发言:

长度不固定,分隔符内的字符个数也不固定,不变的只有‘/’,只能用sqlserve ……

declare @a1 varchar(20),@a2 varchar(20)
set @a1 = 'F/G/R/E/T/E/S/T/'
set @a2 = '/T/S/E/T/R/G/F'
-- reverse()是把字符串倒置,reverse(a1)后,就是 a2
select substring(reverse(@a1),2,1)
#11
radiofan2021-04-29 12:55
以下是引用mywisdom88在2021-4-29 12:48:20的发言:


declare @a1 varchar(20),@a2 varchar(20)
set @a1 = 'F/G/R/E/T/E/S/T/'
set @a2 = '/T/S/E/T/R/G/F'
-- reverse()是把字符串倒置,reverse(a1)后,就是 a2
select substring(reverse(@a1),2,1)


F、G、R、E等都是变量,不确定位数,不确定内容
#12
mywisdom882021-04-29 13:24
那就改为
select substring(reverse(@a1),2,charindex('/',reverse(@a1),2) - 1)
我没测试,也可能是
select substring(reverse(@a1),2,charindex('/',reverse(@a1),2) - 2)
你自己测试一下

[此贴子已经被作者于2021-4-29 13:26编辑过]

#13
radiofan2021-04-29 14:12
以下是引用mywisdom88在2021-4-29 13:24:38的发言:

那就改为
select substring(reverse(@a1),2,charindex('/',reverse(@a1),2) - 1)
我没测试,也可能是
select substring(reverse(@a1),2,charindex('/',reverse(@a1),2) - 2)
你自己测试一下


这样:select reverse(substring(reverse(@a1),2,charindex('/',reverse(@a1),2) - 2))

我的复杂了:select reverse(left(right(Reverse(@a1),LEN(@a1)-1),charindex('/',right(Reverse(@a1),LEN(@a1)-1))-1))

[此贴子已经被作者于2021-5-3 20:35编辑过]

#14
mywisdom882021-04-29 20:32
如果是表1(字段1,字段2),其中,字段1,是楼主的问题。那就
select 字段1,字段2,substring(reverse(字段1),2,charindex('/',reverse(字段1),2) - 2) as 取数 from 表1


#15
radiofan2021-04-29 22:07
回复 14楼 mywisdom88
就取一个字段的最后一个分隔符后的一组字符串。多谢!
#16
radiofan2021-04-30 14:13
因为sqlserver没有从右边定位字符的函数,这里的思路主要是字符串反转,取值后再反转回来即可。
#17
radiofan2021-05-03 20:37
以下是引用mywisdom88在2021-4-29 20:32:17的发言:

如果是表1(字段1,字段2),其中,字段1,是楼主的问题。那就
select 字段1,字段2,substring(reverse(字段1),2,charindex('/',reverse(字段1),2) - 2) as 取数 from 表1


需要再reverse转回来 !
1