【问题标题】:How do I use a comma delimited string as query criteria on a numeric field如何使用逗号分隔的字符串作为数字字段的查询条件
【发布时间】:2021-06-27 00:38:10
【问题描述】:

我已经构建了一个函数,可以从列表框中的多个选择中创建一个逗号分隔的字符串。当我尝试将其用作我的 sql(在 VBA 中)中的 Where 子句时,我收到“类型不匹配”错误 - 因为我使用的条件字段是数字。我该如何解决这个问题? 示例:

sql = "INSERT INTO tblItemsLibrary ( Constr, Description) ...
      "WHERE (((tblItemsLibrary1.ItemsLibID) In (" & strSelectedRecords & ")));"

在上面的示例中,strSelectedRecords 以“17,11,28”的形式出现,其中字段为长。

【问题讨论】:

  • strSelectedRecords 中是否嵌入了引号?如果是,为什么要添加它们,如果不是,那么如果 ItemsLibID 是应该工作的数字...... "WHERE tblItemsLibrary1.ItemsLibID In (17,11,28);" 看起来不错(没有那些额外的括号)。

标签: sql vba ms-access criteria type-mismatch


【解决方案1】:

可以使用LIKE:

INSERT INTO tblItemsLibrary ( Constr, Description)
    ...
    WHERE "," & tblItemsLibrary1.ItemsLibID) & "," LIKE "*," & strSelectedRecords & ",*"

实际上,您可能希望将strSelectedRecords 调整为以*,,* 开头和结尾。

【讨论】:

    【解决方案2】:

    如果您使用的是SQL Server 2016或以上版本,可以使用函数string_split:

    SELECT *
    FROM tblItemsLibrary
    WHERE tblItemsLibrary1.ItemsLibID IN (select * from STRING_SPLIT(@numlist, ','))
    
    Replace @numlist with your string 17,11,28
    

    另一种方法是构造动态 sql 并将其传递到基本 sql 语句之上:

    EXECUTE('SELECT * FROM tblItemsLibrary1 WHERE ItemsLibID IN 
    ('+@numlist+')')
    

    【讨论】:

      【解决方案3】:

      您的 SQL 表达式将导致:

      INSERT INTO tblItemsLibrary ( Constr, Description) 
      ... 
      WHERE (((tblItemsLibrary1.ItemsLibID) In (17,11,28)));
      

      如果ItemsLibID 是数字,这是正确的。

      因此,您的错误可能是由您尝试插入的引起的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多