LIKE查询以查找作为较长字符串

时间:2016-01-17 15:25:39

标签: sql ms-access access-vba sql-like

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

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

由于

TMA

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

如果我使用:

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

它适用于完全匹配。

Access 2007 DAO

我的声明有什么问题?谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

Ok Gord和Parfait。你们两个都让我走上正确的道路,是的,我确实得到了回报。这是我用来创建删除查询的内容:

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

谢谢!