当所需的部分被相同的字符“/”包围时,如何选择字符串的中间部分,并且字符串的开头并不总是在同一个索引处?
e.g. "NWST/330/23/WT6" to "330"
and "NTW/1010/43/TY7" to "1010"
and "TYQT/99/WYT3" to "99"
我尝试过SQL函数的组合,包括CharIndex
,Len
,Left
,Right
,Mid
,InStr
和{{1请帮助!?!?!?!
:(
答案 0 :(得分:4)
您可以使用VBA Split()函数。你给它一个字符串,并告诉它使用什么作为分隔符;它返回一个子串数组。在你的情况下,似乎你想要第二个子串,因为数组编号是从零开始的:
? Split("NWST/330/23/WT6", "/")(1)
330
您不能直接在Access查询中使用该功能,但您可以创建使用它的自定义功能。
Public Function CustomSplit(ByVal pInput As String) As String
CustomSplit = Split(pInput, "/")(1)
End Function
然后,从立即窗口:
? CustomSplit("NWST/330/23/WT6")
330
因此,您可以在从Access会话中运行的查询中使用CustomSplit()。但是,如果您使用其他方法(经典ASP,Dot.Net等)来查询Access数据库,则用户定义的函数不可用,因此您需要使用不同的方法。
因此,如果您的文本位于名为raw_text的字段中,则查询可以是:
SELECT
raw_text,
CustomSplit(raw_text) AS middle_section
FROM YourTableNameHere;
如果您更喜欢没有自定义功能的查询,可以使用您在问题中提到的一些功能。
SELECT
raw_text,
Mid(Left(raw_text, InStr(InStr(1, raw_text, "/") + 1,
raw_text, "/") - 1), InStr(1, raw_text, "/") + 1)
AS middle_section
FROM YourTableNameHere;
这些查询中的任何一个都将此作为输出:
raw_text middle_section
NWST/330/23/WT6 330
NTW/1010/43/TY7 1010
TYQT/99/WYT3 99
答案 1 :(得分:0)
应该这样做。
declare @input varchar(255);
declare @input2 varchar(255)
set @input = 'NTW/1010/43/TY7'
set @input2 = substring(@input,charindex('/', @input) + 1, len(@input))
select substring(@input2, 0, charindex('/', @input2))
几乎不是最优雅但功能性的。
答案 2 :(得分:0)
我没有安装访问权限,但这应该可行,或者至少让您关闭:
=MID(<str>,INSTR(1,<str>,"/")+1,INSTR(INSTR(1,<str>,"/")+1,<str>,"/")-1)
以下是在Excel中测试的方法(我测试过)
=MID(A4,SEARCH("/",A4,1)+1,SEARCH("/",A4,SEARCH("/",A4)+1)-SEARCH("/",A4)-1)
和SQL(我也测试过)
declare @theStr VARCHAR(200)
set @theStr = 'NWST/330/23/WT6'
select SUBSTRING(@theStr,charindex('/',@theStr)+1,CHARINDEX('./',@theStr,2)+
charindex('/',@theStr)-2)