Sql 如何替换access中多字段值列中的文本
我有一个Sql 如何替换access中多字段值列中的文本,sql,ms-access,Sql,Ms Access,我有一个表格a,如下所示,我知道它的多字段值列设计很糟糕,但我现在真的在寻找一个黑客 Student | Age | Classes --------|------|---------- foo | 23 | classone, classtwo, classthree, classfour bar | 24 | classtwo, classfive, classeight 当我运行一个简单的select查询(如下所示)时,我希望结果的显示方式是,即使出现class
表格a
,如下所示,我知道它的多字段值列设计很糟糕,但我现在真的在寻找一个黑客
Student | Age | Classes
--------|------|----------
foo | 23 | classone, classtwo, classthree, classfour
bar | 24 | classtwo, classfive, classeight
当我运行一个简单的select查询(如下所示)时,我希望结果的显示方式是,即使出现class2
也显示为class2
select student, classes from tablea;
我尝试了
replace()
函数,但它在多值字段上不起作用>\up>您处境艰难,我想不出适合您的SQL解决方案。我认为您最好的选择是编写一个VB函数,它将获取数据字符串,解析(替换)返回您可以更新数据的更新字符串。我可以想出很多方法来解决这个问题
您可以在查询中使用Classes.Value分解mv。这将导致查询中的每个值都显示一行,因此您现在可以对该行使用replace。但是,这将导致每个类有一个单独的行
所以用这个:
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
公共函数strClass(id作为变量)作为字符串
将rst设置为DAO.Recordset
如果IsNull(id)=False,则
Set rst=CurrentDb.OpenRecordset(“从tableA中选择Classes.Value,其中id=“&id”)
rst.EOF=False时执行
如果strClass为“”,则strClass=strClass&“
strClass=strClass&Replace(rst(0),“二级”,“二级”)
rst.MoveNext
环
rst.关闭
设置rst=无
如果结束
端函数
此外,如果将其发送到报表,则可以转储上述所有想法,只需将上述内容绑定到报表上的文本框,并在文本框控件中的文本框周围放置一个替换命令。您很可能会将此信息发送到报表,但您确实询问了如何在查询中执行此操作,这可能是错误的问题,因为您可以在报表编写器中“修复”此问题,而不必在查询级别修改数据。我还认为报表编写器中使用的replace()命令可能会执行得最好。但是,上面的查询是可以导出的,因此它实际上取决于这里的最终目标
所以有很多简单的方法可以做到这一点。Jut要澄清的是,您是指新的to-Access2007(ACE),而不是一个包含分隔文本值的文本列吗?