【问题标题】:MS Access Split -> Manipulate and merge string in queryMS Access Split -> 在查询中处理和合并字符串
【发布时间】:2021-04-24 19:25:53
【问题描述】:

我在一列中得到以下类型的输入,并希望得到下面的输出

输入:

01212/001231412/0123123
04654/000009846/9015684

输出:

01212/1231412/0123123
04654/9846/9015684

所以我需要删除中间部分的前导零。我的假设是

  • 我需要拆分字符串
  • 检测第二部分是否有前导零
  • 将所有内容合并在一起

这可以在 Access via SQL 中实现,还是我需要编写 VBA 脚本? 第二部分如何自动检测前导零?

【问题讨论】:

  • 是否可以删除所有前导零,或者您是否希望这只是倒数第二个数字?
  • 替换前导零的原因是什么? “001231412”和“000009846”都失去了前导0,但“0123123 04654”没有。
  • @Albert 和 Applecore:由于转移到另一个系统,我只需要删除第二部分中的前导零。
  • 好吧,正如代码所示,您可以选择 0 到任何数字 - 最后一次编辑显示转换 1 和 3(它基于零),以便将 1 和 4 转换为数字并删除零。如果您只想删除第二个元素-那么只需使用 buf(1) = clng(buf(1) 就可以了。如上所述,您甚至可以在 sql 查询中使用该函数-然后您可以创建一个追加查询到新表,甚至直接针对该查询而不是表导出。不清楚您的示例如何或为什么说第 4 个元素用于删除前导零 - 但代码允许您选择要转换的任何元素。

标签: sql vba ms-access


【解决方案1】:

您确实可以使用 VBA 过程来执行此操作。我的例子如下:

Function fRemoveZero(strData As String) As String
    Dim aData() As String
    Dim intLoop1 As Integer
    aData = Split(strData, "/")
    If LBound(aData) = UBound(aData) Then
        fRemoveZero = strData
    Else
        For intLoop1 = LBound(aData) + 1 To UBound(aData)
            If IsNumeric(aData(intLoop1)) Then aData(intLoop1) = CLng(aData(intLoop1))
        Next intLoop1
        fRemoveZero = Join(aData, "/")
    End If
End Function

在样本上运行时:

?fRemoveZero("01212/001231412/0123123 04654/000009846/9015684")
01212/1231412/0123123 04654/9846/9015684

问候,

【讨论】:

    【解决方案2】:

    这将起作用:

      Sub Rzeros()
      
         Dim strInString      As String
         Dim strOutString     As String
         Dim buf              As Variant
         
         strInString = "01212/001231412/0123123 04654/000009846/9015684"
         
         buf = Split(strInString, "/")
         buf(1) = Clng(buf(1))
         buf(3) = CLng(buf(3))
         
         strOutString = Join(buf, "/")
         
         Debug.Print strOutString
         
      End Sub
    
    OutPut:
    01212/1231412/0123123 04654/9846/9015684
    

    要在查询、报告或任何表达式中使用它?然后使用这样的函数:

    Public Function Znum(v As Variant) As String
    
      If IsNull(v) Then Exit Function
      
      Dim buf        As Variant
      buf = Split(v, "/")
      buf(1) = CLng(buf(1))
      buf(3) = CLng(buf(3))
      
      Znum = Join(buf, "/")
      
    End Function
    

    因此,现在在报表或表单中,您可以使用此表达式作为控制源:

    =(Znum([My column name]))
    

    或者,在 sql 查询中,您可以这样做:

    SELECT ID,  FunnyNumber, Znum([FunnyNumber]) AS Betternum from MyTable
    

    【讨论】:

    • 根据给出的示例,这将不起作用 - 第二个元素“001231412”也需要丢失前导 0。
    • 只需对倒数第二个添加额外的相同技巧即可。我会编辑 - 这是一个微不足道的变化。我的意思是,这里的想法和概念应该很清楚。
    • 查看我的编辑——它现在可以工作了——你只需对第二个元素做同样的事情——然后就可以了!我认为像您所做的那样使用循环没有什么理由 - 但不用担心。
    • 我正在使用循环以防万一元素数量可变.....
    • 当然 - 这很公平。问题确实表明这种转换只发生在第二个数字上,第二个到最后。因此,当实际上要对要转换的 2 个元素进行硬编码时,尚不清楚这种解决方案如何针对可变数量的元素起作用?如前所述,我们都要求提供更多信息 - 是所有数字,还是只是倒数第二个和第二个?如果所有数字?然后我会投票给你的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    相关资源
    最近更新 更多