我继承了一个数据库,其中用户输入字段存储为逗号分隔的字符串。我知道。瘸。我想要一种方法来解析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
任何同意意见?
答案 0 :(得分: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
现在在您的查询中,您可以获取字符串中的任何字段,如下所示: GetValueFromDelimString([MultiValueField],0)AS FirstElement,GetValueFromDelimString([MultiValueField],1)AS SecondElement等。
我觉得我正在为未成年人购买啤酒,鼓励这种行为:)
答案 1 :(得分:0)
听起来你并没有要求提供有关如何将逗号分隔的字段解析为不同字段的信息,而是寻找人们支持你做出决定,是吗?
正如您已经发现的那样,您可以通过熟练应用SQL字段定义中的函数来实现此目的。但这并不意味着你应该。
从短期来看,这是实现数据管理员目标的简单方法,我会授予您这一权利。但作为一个长期的解决方案,它只是为看似设计糟糕的数据库增加了另一层复杂性(我知道后者不是你的错 - 我也继承了我的“跛脚”数据库)。
所以我现在赞扬你“完成工作”,但会建议你听听“你把所有字段插入新表中的建议” - 这些都是很好的建议。它需要更多的计划和努力,但从长远来看,你将拥有一个更好的数据库。这将使你用它做的一切变得更容易,更快,更可靠。
答案 2 :(得分:0)
这是一个旧线程,但是有人可以搜索它。您还可以执行与更新查询相同的策略。这样,您可以保留原始CSV并拥有3个新的目标字段,可以根据您的应用目的进行计算和重新计算。