【问题标题】:LIKE query to find column values that are substrings of a longer stringLIKE 查询以查找作为较长字符串的子字符串的列值
【发布时间】:2016-01-17 15:25:38
【问题描述】:

我想使用此代码在字段 PID 中查找一个值,该值可能存在于字段 MP_PID 的任何位置,但我的 SQL 没有捕获它们。没有错误被抛出。我做错了什么?

它正在比较两个记录集中文本字段的值。

谢谢

TMA

strPID = "DELETE * FROM tblPID WHERE PID Like '*" & !MP_PID & "*';"

如果我使用:

strPID = "DELETE * FROM tblPID WHERE PID = '" & !MP_PID & "';"

它适用于完全匹配。

访问 2007 DAO

我的like 语句有什么问题?谢谢!

【问题讨论】:

    标签: sql ms-access vba sql-like


    【解决方案1】:

    LIKE 表达式用于标识 LIKE 运算符左侧的值包含由 LIKE 运算符右侧的通配符字符串表示的字符串(或字符模式)的记录。

    你的情况

    ... '0123456A' LIKE '*0000623E 0123456A*'
    

    将返回 False,因为左侧不包含右侧的整个字符串。

    你真正想要的是

    ... '0000623E 0123456A' LIKE '*0123456A*'
    

    这意味着您需要 LIKE 运算符左侧的 MP_PID 值。

    要正确地做到这一点(即,使用参数化查询)看起来像这样:

    Option Compare Database
    Option Explicit
    
    Sub LikeTest()
        ' test data
        Dim MP_PID As String
        MP_PID = "0000623E 0123456A"
    
        Dim cdb As DAO.Database
        Set cdb = CurrentDb
        Dim qdf As DAO.QueryDef
        Set qdf = cdb.CreateQueryDef("", _
                "PARAMETERS [LongerText] TEXT(255);" & _
                "DELETE * FROM tblPID WHERE [LongerText] LIKE '*' & PID & '*'")
        qdf!LongerText = MP_PID
        qdf.Execute dbFailOnError
        Debug.Print qdf.RecordsAffected & " record(s) deleted."
        Set qdf = Nothing
        Set cdb = Nothing
    End Sub
    

    【讨论】:

      【解决方案2】:

      PID 很可能是一个数字字段,您使用遍历字符串值的LIKE 运算符。尝试将数值转换为字符串:

      strPID = "DELETE * FROM tblPID WHERE CSTR(PID) Like '*" & !MP_PID & "*';"
      

      或者,将一个空长度的字符串值连接到数值(类似于通过连接星号和引号将文本框数值转换为字符串):

      strPID = "DELETE * FROM tblPID WHERE PID & '' Like '*" & !MP_PID & "*';"
      

      【讨论】:

      • 两者绝对是字符串。我尝试了两种演绎方式,并且匹配的位置与 like 语句的工作方式完全相同。所以我还是很茫然。其中 PID = 0123456A 和 !MP_PID = '0123456A' 它可以工作。如果 PID = '0123456A' 和 !MP_PID = '0000623E 0123456A' 它不起作用。如果重要的话,!MP_PID 中的值之间有一个空格
      • @Darwind - 如果要在 MP_PID 值搜索 PID 值,则需要颠倒它们在 LIKE 表达式中出现的顺序。
      【解决方案3】:

      好的,戈德和冻糕。你们都让我走上了正确的道路,是的,我确实把它找回来了。这是我用来创建删除查询的内容:

              strDelMP = "DELETE tblPID.* FROM tblPID INNER JOIN tblMgtPlan ON tblMgtPlan.MP_PID Like '*' + tblPID.PID + '*';"
          db.Execute (strDelMP)
      

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 2014-12-04
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        相关资源
        最近更新 更多