我继承了一个数据库,其中用户输入字段存储为逗号分隔的字符串。我知道。瘸。我想要一种方法来解析SELECT查询中的这些字段,其中有三个不同数量的字符段。与我将字段插入新表或创建存储过程来执行此操作的所有建议相反,这就是我想出的。我想知道是否有人看到任何缺陷这样做作为一个选择查询(我可以很容易地从字符串转换为解析,然后根据需要再次返回)。
Field_A
5,25,89
所以要获得左段,这是最直接的:
Field_1: Left$([Field_A],InStr([Field_A],",")-1)
要获得最正确的细分:
Field_3: Right$([Field_A],Len([Field_A])-InStrRev([Field_A],","))
中段是最棘手的:
Field_2: Mid([Field_A],InStr([Field_A],",")+1,InStrRev([Field_A],",")-InStr([Field_A],",")-1)
结果是:
Field_1 Field_2 Field_3
5 25 89
任何同意的意见?
好吧,如果你坚持走这条路......这可能更容易,更具适应性。在模块中创建一个函数:
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
现在在您的查询中,您可以获取字符串中的任何字段,如下所示:GetValueFromDelimString([MultiValueField],0)AS FirstElement,GetValueFromDelimString([MultiValueField],1)AS SecondElement等。
我觉得我正在为一个未成年人买啤酒,鼓励这种行为:)
听起来你并没有要求提供有关如何将逗号分隔的字段解析为不同字段的信息,而是寻找人们支持你做出决定,是吗?
正如您已经发现的那样,事实上您可以通过熟练应用SQL字段定义中的函数来实现此目的。但这并不意味着你应该这样做。
从短期来看,这是实现数据管理员目标的简单方法,我会授予您这一权利。但作为一个长期的解决方案,它只是为一个设计糟糕的数据库增加了另一层复杂性(我知道后者不是你的错 - 我也继承了我的“跛脚”数据库)。
所以我赞赏你现在“完成工作”,但会建议你听“你在新表中插入字段的所有建议” - 这些都是很好的建议。它需要更多的计划和努力,但从长远来看,你将拥有一个更好的数据库。这将使您使用它所做的一切变得更容易,更快速,更可靠。
这是一个旧线程,但有人可能会搜索它。您还可以执行与更新查询相同的策略。这样,您可以保留原始CSV并具有3个新的目标字段,可以根据您的应用目的进行计算和重新计算。