Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何替换access中多字段值列中的文本_Sql_Ms Access - Fatal编程技术网

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),而不是一个包含分隔文本值的文本列吗?