5

我继承了一个数据库,其中用户输入字段存储为逗号分隔的字符串。我知道。瘸。我想要一种在 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

有没有同意的意见?

4

3 回答 3

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 等。

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

于 2013-02-01T21:18:55.703 回答
0

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

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

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

所以我现在就“完成工作”为你鼓掌,但建议你听听“将字段插入新表的所有建议”——它们是很好的建议。这将需要更多的计划和努力,但从长远来看,您将拥有一个更好的数据库。这将使您使用它所做的一切变得更容易、更快、更可靠。

于 2013-02-01T19:41:47.193 回答
0

这是一个旧线程,但有人可能会搜索它。您也可以执行与更新查询相同的策略。这样,您可以保留原始 CSV 并拥有 3 个新的目标字段,可以根据您的应用程序目的进行计算和重新计算。

于 2019-04-19T23:52:29.037 回答