将逗号分隔的字段解析为单独的字段(MS ACCESS VBA 2003)

TSS*_*TSS 5 ms-access comma access-vba delimited-text

我继承了一个数据库,其中用户输入字段存储为逗号分隔的字符串.我知道.瘸.我想要一种方法来解析SELECT查询中的这些字段,其中有三个不同数量的字符段.与我将字段插入新表或创建存储过程来执行此操作的所有建议相反,这就是我想出的.我想知道是否有人看到任何缺陷这样做作为一个选择查询(我可以很容易地从字符串转换为解析,然后根据需要再次返回).

Field_A
5,25,89
Run Code Online (Sandbox Code Playgroud)

所以要获得左段,这是最直接的:

Field_1: Left$([Field_A],InStr([Field_A],",")-1)
Run Code Online (Sandbox Code Playgroud)

要获得最正确的细分:

Field_3: Right$([Field_A],Len([Field_A])-InStrRev([Field_A],","))
Run Code Online (Sandbox Code Playgroud)

中段是最棘手的:

Field_2: Mid([Field_A],InStr([Field_A],",")+1,InStrRev([Field_A],",")-InStr([Field_A],",")-1)
Run Code Online (Sandbox Code Playgroud)

结果是:

Field_1   Field_2   Field_3
5           25        89
Run Code Online (Sandbox Code Playgroud)

任何同意的意见?

小智 6

好吧,如果你坚持走这条路......这可能更容易,更具适应性.在模块中创建一个函数:

Public Function GetValueFromDelimString(sPackedValue As String, nPos As Long, 
                                        Optional sDelim As String = ",")

Dim sElements() As String

sElements() = Split(sPackedValue, sDelim)
If UBound(sElements) < nPos Then
    GetValueFromDelimString = ""
Else
    GetValueFromDelimString = sElements(nPos)
End If

End Function
Run Code Online (Sandbox Code Playgroud)

现在在您的查询中,您可以获取字符串中的任何字段,如下所示:GetValueFromDelimString([MultiValueField],0)AS FirstElement,GetValueFromDelimString([MultiValueField],1)AS SecondElement等.

我觉得我正在为一个未成年人买啤酒,鼓励这种行为:)


Lok*_*rim 0

听起来您并不是在询问有关如何将逗号分隔的字段解析为不同字段的信息,而是在寻找人们支持您这样做的决定,是吗?

事实上,正如您已经发现的那样,您确实可以通过在 SQL 字段定义中熟练应用函数来做到这一点。但这并不意味着您应该这样做。

从短期来看,这是实现数据管理员目标的简单方法,我同意。但作为一个长期的解决方案,它只是给一个看起来设计糟糕的数据库增加了另一层复杂性(我知道后者不是你的错——我也继承了我的“蹩脚”数据库)。

因此,我对您现在“完成工作”表示赞赏,但建议您听取“将字段插入新表中的所有建议”——它们都是很好的建议。这需要更多的规划和努力,但从长远来看,您将拥有更好的数据库。这将使您使用它所做的一切变得更容易、更快、更可靠。