有如下格式的一个字符串(其实是SQL语句的SELECT和FROM之间的部分):
field1,field2,field3 AS alias1,FUNCTION1(field4),FUNCTION2(field5) AS ALIAS2
其中FUNCTION可能为SUM、AVG、COUNT中的某一个,field个数不定。如何能把field和FUNCTION分离出来??field写入一维数组arrTemp1()中,即arrTemp1(0)=field1,……,arrTemp1(4)=field5,……
FUNCTION和ALIAS写入三维数组arrTemp2()中,其中第一维保存field,第二维保存FUNCTION,第三维保存ALIAS.在上边的例句中就是
arrTemp2(0,0)=field3,arrTemp2(0,1)=" ",      arrTemp2(0,2)=alias1;
arrTemp2(1,0)=field4,arrTemp2(1,1)=FUNCTION1,arrTemp2(1,2)=" ";
arrTemp2(2,0)=field5,arrTemp2(2,1)=FUNCTION2,arrTemp2(2,2)=ALIAS2;

解决方案 »

  1.   

    找左括号,取前一个逗号到左括号之间的字符放入 arrTemp2中
    找空格与AS与空格,取到后一个逗号之间的字符放入 arrTemp2中
    那么剩下来的Field取出来就易如反掌了!!!
      

  2.   

    建立以窗体,放一按钮,拷贝下面的代码,调用示例结果显示在立即窗口。
    接分,呵呵Option ExplicitPrivate Sub Command1_Click()
    Dim strSql As String
    Dim arrTemp1() As String
    Dim arrTemp2() As String
    strSql = "field1,field2,field3 AS alias1,FUNCTION1(field4),FUNCTION2(field5) AS ALIAS2"
    '调用举例
    Test strSql, arrTemp1, arrTemp2
    '结果显示
    Dim i As Integer
    Debug.Print "arrTemp1:"
    For i = LBound(arrTemp1) To UBound(arrTemp1)
        Debug.Print arrTemp1(i)
    Next
    Debug.Print "arrTemp2:"
    For i = LBound(arrTemp2, 1) To UBound(arrTemp2, 1)
        Debug.Print arrTemp2(i, 0), arrTemp2(i, 1), arrTemp2(i, 2)
    Next
    End SubPrivate Sub Test(ByVal strSql As String, ByRef ary1() As String, ByRef ary2() As String)
        Dim temp() As String
        Dim flag As Boolean
        Dim i As Integer
        Dim count As Integer
        count = 0
        ary1 = Split(strSql, ",")
        '统计arrTemp2的第一维需要几个元素
        For i = LBound(ary1) To UBound(ary1)
            If InStr(1, ary1(i), " AS ") > 0 Or InStr(1, ary1(i), "(") > 0 Then
                count = count + 1
            End If
        Next
        
        If count > 0 Then
            ReDim ary2(count - 1, 2)
            count = 0
            flag = False
            For i = LBound(ary1) To UBound(ary1)
                If InStr(1, ary1(i), " AS ") > 0 Then
                    temp = Split(ary1(i), " AS ")
                    ary1(i) = Trim(temp(0))
                    ary2(count, 0) = Trim(temp(0))
                    ary2(count, 2) = Trim(temp(1))
                    flag = True
                End If
                If InStr(1, ary1(i), "(") > 0 Then
                    temp = Split(ary1(i), "(")
                    ary1(i) = Left(Trim(temp(1)), Len(Trim(temp(1))) - 1)
                    ary2(count, 0) = ary1(i)
                    ary2(count, 1) = Trim(temp(0))
                    flag = True
                End If
                If flag Then
                    count = count + 1
                    flag = False
                End If
            Next
        End If
    End Sub
      

  3.   

    谢谢chewinggum另附Split函数用法Split函数
    返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
    语法
    Split(expression[,delimiter[,count[,compare]]])
    Split函数语法有如下几部分:
    部分               描述
    expression         必需的。包含子字符串和分隔符的字符串表达式。如果expression是一 个长度为零的字符串(""),Split则返回一个空数组,即没有元素和数据的数组
    delimiter          可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符("")作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的expression字符串。
    count              可选的。要返回的子字符串数,-1表示返回所有的子字符串
    compare            可选的。数字值,表示判别子字符串时使用的比较方式。设置值compare参数的设置值如下:
    常数                 值     描述
    vbUseCompareOption   -1    用OptionCompare语句中的设置值执行比较
    vbBinaryCompare       0    执行二进制比较
    vbTextCompare         1    执行文字比较
    vbDatabaseCompare     2     仅用于MicrosoftAccess。基于您的数据库的信息执行比较