【问题标题】:Trimming leading zeros in MS Access SQL在 MS Access SQL 中修剪前导零
【发布时间】:2015-09-15 09:53:04
【问题描述】:

我需要使用 MS Access SQL 修剪列中的前导零。 我找到了话题 Better techniques for trimming leading zeros in SQL Server? 但是

SUBSTRING(str_col, PATINDEX('%[^0]%', str_col+'.'), LEN(str_col))

在 Access 中不起作用。如何将其“翻译”为 Access SQL?

我把函数SUBSTRING改成了MID,把PATINDEX改成了INSTR,但是还是不行

MID(str_col, INSTR(1, str_col+'.', '%[^0]%'), LEN(str_col))

我的列的数据类型是字符串,所有行看起来像:“002345/200003”,“0000025644/21113”,我需要提取“2345”,“25644”。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    检查零是否真的存在,如果字段是文本,它们可能存在,在这种情况下你可以使用:

    Val(NameOfField)
    

    结果

    Field1  ValField1
    ab      0
    0000123 123
    

    如果字段是数字,您可能在表格中添加了格式,这是一个非常糟糕的主意。

    【讨论】:

    • 哇,它也解决了我的第二个问题,因为我想将“002345/200003”修剪为“2345”,然后函数将其修剪为“2345”:)
    • 小心 Val ab 123 = 0,但 123 ab = 123
    • 正如 Fionnuala 所提到的......你必须小心使用 val 函数。因此我问了数据类型。在任何情况下,如果您的 str_col 有一个非数字字符,val 函数将失败并在找到第一个非数字值之前只返回数字。
    • 谢谢。我有相同格式的所有数据,主要是数字,但其中一些有斜杠 /。
    【解决方案2】:

    vba.Instr 不会按模式匹配。如果您的数据列包含字母或任何字符串,并且您仍想修剪前导零,则可以使用正则表达式。

    这里是一个示例代码:

    Public Function FN_TRIM_LEADING_ZEROS(iValue As String) As String
        Const mExpr As String = "^[0]*" 'all leading 0s to match
    
        Dim mOBJ As Object
        Set mOBJ = VBA.CreateObject("vbscript.RegExp")
    
        mOBJ.Pattern = mExpr
        mOBJ.ignorecase = True
        FN_TRIM_LEADING_ZEROS = mOBJ.Replace(iValue, "")
    
    End Function
    

    只需通过 fn_trim_leading_zeros(Value) 调用该函数,它将返回修剪前导 0。

    ?FN_TRIM_LEADING_ZEROS("00000000subString.AnotherString")
    subString.AnotherString
    

    或者试试这个递归模式:

    Public Function FN_VBA_TRIM_LEADING_ZEROS(iValue As String) As String
        If VBA.Left(iValue, 1) = "0" Then
            iValue = VBA.Right$(iValue, VBA.Len(iValue) - 1)
            FN_VBA_TRIM_LEADING_ZEROS = FN_VBA_TRIM_LEADING_ZEROS(iValue)
        Else
            FN_VBA_TRIM_LEADING_ZEROS = iValue
        End If
    End Function
    

    希望这对其他人有帮助

    【讨论】:

    • 这是 RBAR,所以可能会很慢。
    【解决方案3】:

    如果 varchar 列中的所有记录都是数字,那么您可以简单地将字符串乘以 1。

    不过要小心。迟早会有一些非数字的东西会潜入并通过导致无效的强制转换来破坏事物。如果可能,将列转换为整数类型并将格式留给客户端。

    【讨论】:

    • 这是一个关于 MS Access 问题的 SQL Sever 答案。为什么?
    • @Fionnuala 是什么让您认为这是 SQL Server 的答案?它不是。我在 Access 中经常这样做。
    • 抱歉,是 varchar 让我这么想的,很多 MS Access 问题都得到了 SQL Server 的答案!
    • 哦。是的。我想不起等效的数据类型。不管它是什么,我认为它是我自己脑海中的一个 varchar。
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多