访问SQL查询 - 选择许多不同类型字符串的中间部分

时间:2012-01-17 03:55:46

标签: sql split ms-access-2007

当所需的部分被相同的字符“/”包围时,如何选择字符串的中间部分,并且字符串的开头并不总是在同一个索引处?

e.g. "NWST/330/23/WT6" to "330" 

and  "NTW/1010/43/TY7" to "1010"

and  "TYQT/99/WYT3"    to "99"

我尝试过SQL函数的组合,包括CharIndexLenLeftRightMidInStr和{{1请帮助!?!?!?!

:(

3 个答案:

答案 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)