【问题标题】:Is there an equivalent to the SUBSTRING function in MS Access SQL?MS Access SQL 中是否有等效于 SUBSTRING 的函数?
【发布时间】:2010-10-22 23:42:00
【问题描述】:

我想在 MS Access 查询中执行类似的操作,但 SUBSTRING 是一个未定义的函数。

SELECT DISTINCT SUBSTRING(LastName, 1, 1)
FROM Authors;

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    您可以使用 VBA 字符串函数(正如 @onedaywhen 在 cmets 中指出的那样,它们并不是真正的 VBA 函数,而是 MS Jet 库中的等效函数。就函数签名而言,它们被调用并工作相同,即使 MS Access 的实际存在 并不需要它们可用。):

    SELECT DISTINCT Left(LastName, 1)
    FROM Authors;
    
    SELECT DISTINCT Mid(LastName, 1, 1)
    FROM Authors;
    

    【讨论】:

    • 挑剔点:涉及的 dll 是(我相信)Expsrv.dll 和 vbajet32.dll,MS 文档统称为 Jet Expression Services。所以我认为我们可以将它们视为原生 ACE/Jet 表达式,而不是上下文中的“VBA 函数”。请注意,某些表达式在 ACE/Jet 中的工作方式与其等效的 VBA 函数不同,例如IIF():VBA 总是计算真假子句,而 ACE/Jet 不计算。
    • @onedaywhen:感谢您的澄清。我对写“VBA 函数”犹豫不决,但我不知道该写什么。在提到的字符串函数的情况下,它们显然是等价的。 OTOH - 我认为您甚至可以在 Access 查询中使用用户定义的 VBA 函数,但这可能是 Access 特定的。
    • 我猜这就是为什么 Nz() 在本机 Access 中可用的原因,但在您从 Excel 运行查询时却不可用。
    • Access 是 VBA 的主机。它真的是VBA。 VBAjet.dll 只是 VBA 的加载器。我刚才看的版本只有两个功能:获取表达式服务和加载表达式服务。如果 Get 发现内存中已经加载了 VBA / VB dll,则使用它。如果没有,Access 会加载一个副本。虽然加载器名为 vbajet32,但 Access 实际上是 VBA 主机,并且具有将 VBA 挂钩到 Jet 的钩子。
    【解决方案2】:

    我认为 Access 中有 MID() 和 LEFT() 和 RIGHT()。

    【讨论】:

    • 我将这些与 LEN 一起使用,并从字符串值中获取我需要的大部分内容。
    【解决方案3】:

    我在 msaccess vba 上工作过很多次。 我认为您正在寻找 MID 功能

    例子

        dim myReturn as string
        myreturn = mid("bonjour tout le monde",9,4)
    

    会给你返回值“tout”

    【讨论】:

    • 欢迎来到 StackOverflow!您的答案是正确的,但它可能不会获得任何投票,因为它没有提供任何尚未包含在已接受答案中的新信息。
    【解决方案4】:

    我找不到添加此功能的现成模块,所以我写了一个:

    在 Access 中,转到数据库工具功能区,在宏区域中单击 Visual Basic。在左上角的项目区域中,右键单击文件名并选择插入 -> 模块。在模块中粘贴:

    Public Function Substring_Index(strWord As String, strDelim As String, intCount As Integer) As String
    
    Substring_Index = delims
    
    start = 0
    test = ""
    
    For i = 1 To intCount
        oldstart = start + 1
        start = InStr(oldstart, strWord, strDelim)
        Substring_Index = Mid(strWord, oldstart, start - oldstart)
    Next i
    
    End Function
    

    将模块另存为 module1(默认)。您现在可以使用如下语句:

    SELECT Substring_Index([fieldname],",",2) FROM table
    

    【讨论】:

      【解决方案5】:

      我使用了如下更新查询:我在访问表中添加了一个空列,用于存储我需要的字符串元素。然后我在“UpdateTo”行中用更新查询填充了新列:“Mid([TABLE].[FIELD],3,1)”,因为我需要该字段的 3 个字符。前面的答案把我带到了这里(谢谢)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-30
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多