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

Tol*_*ory 2 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"
Run Code Online (Sandbox Code Playgroud)

我尝试过 SQL 函数的组合,包括CharIndexLenLeftRightMidInStrInStRe请帮助!?!?!?!

:(

Han*_*sUp 5

您可以使用 VBA Split() 函数。您给它一个字符串并告诉它使用什么作为分隔符;它返回一个子字符串数组。在您的情况下,您似乎想要第二个子字符串,并且由于数组编号是从零开始的:

? Split("NWST/330/23/WT6", "/")(1)
330
Run Code Online (Sandbox Code Playgroud)

您不能直接在 Access 查询中使用该函数,但可以创建使用它的自定义函数。

Public Function CustomSplit(ByVal pInput As String) As String
    CustomSplit = Split(pInput, "/")(1)
End Function
Run Code Online (Sandbox Code Playgroud)

然后,从立即窗口:

? CustomSplit("NWST/330/23/WT6")
330
Run Code Online (Sandbox Code Playgroud)

因此,您可以在从 Access 会话内部运行的查询中使用 CustomSplit()。但是,如果您使用其他方法(经典 ASP、Dot.Net 等)来查询 Access 数据库,则用户定义的函数不可用,因此您需要使用不同的方法。

因此,如果您的文本位于名为 raw_text 的字段中,则查询可能是这样的:

SELECT
    raw_text,
    CustomSplit(raw_text) AS middle_section
FROM YourTableNameHere;
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢不带自定义函数的查询,则可以使用问题中提到的一些函数。

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;
Run Code Online (Sandbox Code Playgroud)

这些查询中的任何一个都会产生以下输出:

raw_text         middle_section
NWST/330/23/WT6  330
NTW/1010/43/TY7  1010
TYQT/99/WYT3     99
Run Code Online (Sandbox Code Playgroud)