【问题标题】:Inserting part of a value from one field into another将值的一部分从一个字段插入另一个字段
【发布时间】:2014-01-30 05:59:04
【问题描述】:

我在 MS Access DB 的一个表中工作。我想使用 iif 语句来确定字段 A 中的值是否符合有效格式(在这种情况下,一个或两个数字后跟一个字母)。如果是这样,我想只取字段 A 的数字部分(例如,如果字段 A 的条目是“15B”,我想只考虑“15”部分)并将其插入当前为空的字段我创建的 B。

如何编写只考虑字段 A 的数字部分然后将其插入字段 B 的 MS Access 查询?

【问题讨论】:

  • 你试过什么代码?

标签: sql ms-access


【解决方案1】:

对于您描述的模式,您可以使用like 构建更新查询,如下所示:

UPDATE tbl1 SET tbl1.ValB = 
    Switch([ValA] Like "#[a-z]",Left([valA],1),
    [valA] Like "##[a-z]",Left([valA],2),True,NULL);

或者使用Val函数,它会尽量将字符串转换成数字:

UPDATE tbl1 SET tbl1.ValB = 
iif(valA like "#[a-z]" or valA like "##[a-z]",val(ValA),NULL)

【讨论】:

  • 您提供的第一个语句就像一个魅力。我以前没有使用过 switch 语句或 Left/Right 函数。感谢您的帮助!
【解决方案2】:

您还需要 id 字段

Private Sub bntStart_Click()
    On Error GoTo err_trap

        Dim con As ADODB.Connection
        Dim rsLocal, rsLocal_Upd As ADODB.Recordset

        Dim sql_string As String
        Dim counter, numeric_value As Integer

        Set counter = 1

        sql_string = "SELECT * FROM TblTest"

        Set con = CurrentProject.Connection
        Set rsLocal = con.Execute(sql_string)

        If Not (rsLocal.BOF And rsLocal.EOF) Then
            rsLocal.MoveFirst
            While Not rsLocal.EOF
                If Len(ExtractNumber(rsLocal.Fields("FieldA")) > 0) Then
                    numeric_value = ExtractNumber(rsLocal.Fields("FieldA"))
                    sql_string = "UPDATE TblTerms SET FieldB = " & numeric_value & " WHERE id = " & counter
                    Set con = CurrentProject.Connection
                    Set rsLocal_Upd = con.Execute(sql_string)
                End If
                rsLocal.MoveNext
                counter = counter + 1
            Wend
        End If

        Set con = Nothing
        Exit Sub

    err_trap:
        MsgBox (Err.Description)
        Set con = Nothing

    End Sub

    Function ExtractNumber(str As Srting)
        Dim iCount As Integer, i As Integer
        Dim sText As String
        Dim lNum As String


        'Written by OzGrid Business Applications
        '[url]www.ozgrid.com[/url]

        'Extracts a number from a cell containing text And numbers.

        sText = str

        For iCount = Len(sText) To 1 Step -1
            If IsNumeric(Mid(sText, iCount, 1)) Then
                i = i + 1
                lNum = Mid(sText, iCount, 1) & lNum
            End If

            If i = 1 Then lNum = CInt(Mid(lNum, 1, 1))
        Next iCount

        ExtractNumber = CLng(lNum)
    End Function

请注意,我从这里http://www.ozgrid.com/forum/showthread.php?t=18185获取了ExtractNumber

【讨论】:

    【解决方案3】:

    对于问题的验证部分,您可以使用Like 模式匹配。这是立即窗口中的一个示例。

    ? "15A" Like "#[A-Z]" Or "15A" Like "##[A-Z]"
    True
    
    ? "4B" Like "#[A-Z]" Or "4B" Like "##[A-Z]"
    True
    
    ? "123A" Like "##[A-Z]" Or "123A" Like "##[A-Z]"
    False
    
    ? "15AB" Like "#[A-Z]" Or "15AB" Like "##[A-Z]"
    False
    
    ? "15!" Like "#[A-Z]" Or "15!" Like "##[A-Z]"
    False
    

    如果这些测试正确表达了您的意图,您可以将其用作Field A验证规则

    Like "#[A-Z]" Or Like "##[A-Z]"
    

    至于Field B,您可以在查询中将其设为字段表达式。

    SELECT
        [Field A],
        Val([Field A]) AS [Field B]
    FROM YourTable;
    

    在您需要查看[Field B] 的任何地方使用该查询。使用这种方法,如果您的表中不存在[Field B],则您无需担心每当[Field A] 值发生变化时更新[Field B] 存储的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多