【问题标题】:Query to parse a field and display it查询解析字段并显示它
【发布时间】:2015-06-27 21:31:08
【问题描述】:

我有一个包含值的表格

Errors:
X_11;SR_4;D_11;SR_2
SR_4;T_22
E_18; E_28; SR_3; 
E_28; SR_3; 
SR_2;SR_4

我需要输入一个查询来解析这些值,以便出现带有 SR 的任何内容,所以我执行 like "*SR*" 但在输出中我只需要显示这个:

Errors:
SR_4;SR_2
SR_4
SR_3 
SR_3 
SR_2;SR_4

我希望在查询中使用除此之外的许多字段...而不是 VBA。我正在使用 MS Access 2010,我猜是某种类型的解析,每个字段都用“;”分隔那只会捕获SR?

【问题讨论】:

  • 您似乎只想过滤带有值SR_# 的错误(其中# 是一个数字)。 # 总是一个数字吗?
  • 您是否事先知道要省略哪些错误(或错误模式)?
  • 每行的错误代码是否唯一? (即,您在每一行中的 SR_2 不超过一次)
  • 每行只有一种错误类型,因此它只有 1 个 SR_2 ... 和另一个 SR_4,但绝不会有 2 个 SR_2。目前在 SR_# 之后只有 1 位而不是 2 位

标签: ms-access ms-access-2010


【解决方案1】:

我认为正则表达式可能是一种方法。

在 VBA 中,您需要启用对“Microsoft VBScript 正则表达式 5.5”的引用。 This question and its accepted answer 详细说明了什么是正则表达式以及如何在您的项目中启用它们(适用于 Excel,但适用于 Access 的路线相同)。

一旦你启用了引用,这个小函数会给你一个“干净”的字符串:

Public Function filterString(str As String)
    Dim re As RegExp, obj As Object, x As Variant, first As Boolean
    Set re = New RegExp
    With re
        .Global = True
        .IgnoreCase = True
        .MultiLine = False
        .Pattern = "SR_[0-9]" ' This will match the string "SR_" 
                              ' followed by a digit
    End With

    filterString = ""
    first = True

    If re.Test(str) Then
        Set obj = re.Execute(str)
        For Each x In obj
            If first Then
                first = False
            Else
                filterString = filterString & ";"
            End If
            filterString = filterString & x
        Next x
    End If
End Function

如果你测试一下,你会看到结果是:

filterString("X_11;SR_4;D_11;SR_2")
  SR_4;SR_2

这是你想要的结果。

现在,一个简单的select 查询将为您提供所需的内容:

select filterString([Errors]) as err
from [yourTable]
where [yourTable].[Errors] like '*sr*'

希望对你有帮助

【讨论】:

  • error "user defined type not defined" RegExp 问题....我可以访问 2010 任何其他变量可以使用吗?
  • @Edgar 乐于助人。如果您觉得此答案有用,请点赞(和/或接受)
【解决方案2】:

我认为您可以通过将输入字符串拆分为一个数组然后使用Filter 函数创建第二个数组来获得所需的内容,该数组仅包含第一个数组中的 SR_ 匹配项。最后Join 第二个数组生成包含匹配项的输出字符串。

Public Function filterString(ByVal pInput As String) As String
    Dim array1() As String
    Dim array2() As String
    array1 = Split(Replace(pInput, " ", vbNullString), ";")
    array2 = Filter(array1, "SR_")
    filterString = Join(array2, ";")
End Function

相对于正则表达式的方式,这个函数更加简洁。我发现逻辑更简单。而且它不需要设置参考。

请注意,它还可以容纳包含多个单个数字的 SR 代码(以防最终成为要求)。例如:

? filterString("X_11;SR_4;D_11;SR_234")
SR_4;SR_234

您可以按照@Barranka 建议的方式在查询中使用该函数:

SELECT filterString(y.Errors) AS sr_codes
FROM [yourTable] AS y
WHERE y.Errors Like '*sr*';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多