如何替换访问中的多字段值列中的文本

时间:2012-02-24 02:19:58

标签: sql ms-access

我有一个tablea如下,我知道它的设计有多字段值,但我现在正在寻找一个黑客。

Student | Age  | Classes
--------|------|----------
foo     | 23   | classone, classtwo, classthree, classfour
bar     | 24   | classtwo, classfive, classeight

当我运行如下的简单选择查询时,我希望结果能够显示classtwo即使出现class2

select student, classes from tablea;

我尝试了replace()功能,但它不适用于多值字段> _<

2 个答案:

答案 0 :(得分:0)

您处境艰难,我无法为您考虑SQL解决方案。我认为你最好的选择是编写一个VB函数,它将获取数据字符串,解析出来(替换)返回你可以更新数据的更新字符串。

答案 1 :(得分:0)

我可以通过很多方法来解决这个问题。

您可以在查询中使用Classes.Value来爆炸mv。这将导致查询中的每个值出现一行,因此您现在可以使用替换。但是,这将为每个类生成一个单独的行。

所以使用这个:

Select student, classes.Value from tablea

或者,对于这个例子:

Select student, replace(classes.Value,"classtwo","class2") as myclass 
from tablea

如果你想要一行,并且多值类不是来自另一个表(否则它们将返回ID而不是文本),然后你可以使用以下技巧

Select student, dlookup("Classes","tablea","id = " & [id]) as sclasses 
from tablea

如果使用dlookup(),上面将返回由空格分隔的类作为字符串。所以只需将replace添加到上面的SQL中。我想如果你愿意的话,你也可以将空间替换回“,”进行显示。

最后但并非最不重要的是,如果这些类来自另一个表,那么上面的dlookup()想法将不起作用。所以只需创建一个VBA函数。

您的查询变为:

Select student, strClass([id]) as sclasses from tablea

在标准代码模块中,您可以创建一个这样的公共函数:

Public Function strClass(id As Variant) As String

   Dim rst        As DAO.Recordset

   If IsNull(id) = False Then

      Set rst = CurrentDb.OpenRecordset("select Classes.Value from tableA where id = " & id)
      Do While rst.EOF = False
         If strClass <> "" Then strClass = strClass & ","
         strClass = strClass & Replace(rst(0), "classtwo", "class2")
         rst.MoveNext
      Loop
      rst.Close
      Set rst = Nothing
   End If

End Function

此外,如果您将其发送到报告中,那么您可以将所有上述想法转移,并将上述内容绑定到报告上的文本框,并将“替换”命令放在文本框控件中。您很可能会将此信息发送到报告中,但您确实询问了如何在查询中执行此操作,这可能是错误的问题,因为您可以在报告编写器中“修复”此问题而不是修改数据在查询级别。我还认为报表编写器中使用的replace()命令可能表现最佳。但是,上面的查询可以导出,所以它实际上取决于最终目标。

有很多简单的方法可以做到这一点。