我有一个tablea
如下,我知道它的设计有多字段值,但我现在正在寻找一个黑客。
Student | Age | Classes
--------|------|----------
foo | 23 | classone, classtwo, classthree, classfour
bar | 24 | classtwo, classfive, classeight
当我运行如下的简单选择查询时,我希望结果能够显示classtwo
即使出现class2
select student, classes from tablea;
我尝试了replace()
功能,但它不适用于多值字段> _<
答案 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()命令可能表现最佳。但是,上面的查询可以导出,所以它实际上取决于最终目标。
有很多简单的方法可以做到这一点。