小编典典

使用IN子句从Excel中进行参数化查询

sql

我有一个MS Query从工作Excel 2016表到IBM DB2数据库的连接。我使用参数化查询并将参数值链接到Excel单元格。尽管“奇异值”子句可以= < > like工作,但我无法让IN子句
与多个值 一起工作 但要使用超级简单的查询。

D列公式=IF(C2>5,A2&",","")用于检查C列的值是否大于5,并ID在D列中填充TRUE。我期望使用一个辅助单元格来合并/合并我要使用forIN子句作为值的D列中的所有值(
尚未完成 )。

如何"value1, value2, value3, ..."在单元格中使用它来运行IN子句查询? 有可能吗?
IN链接的单元格保留值时,子句工作正常,1但是1, 3会产生错误消息: "Bad parameter type. Microsoft Excel is expecting a different kind of value than what was provided"

OR技术上讲,为每个单元格使用单独的参数和子句看起来可行,但是在实践中,数据集可以轻松达到50-100个值,这意味着疯狂的参数设置。

查询本身很简单:

select * from PRODUCTS a
where a.prod_ID in (1,3)

或作为Excel MS Query替代方法:

select * from PRODUCTS a
where a.prod_ID in ?

阅读 252

收藏
2021-04-15

共1个答案

小编典典

在这里发布以供将来的Google员工使用。因此,该解决方案对我来说有点开箱即用-尽管仍然需要增强。

它检查M1:M4范围内的工作表更改事件,然后根据B1中准备好的语法填充子句中的查询命令文本。真的对我来说是开箱即用的!

不幸的是,尽管这里有多个应该接受相同处理的列表对象,但它只处理一个ListObject(1)-尽管如此,它还是很棒的东西。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim INvaluesCell As Range
    Dim SQLin As String, parts As Variant
    Dim i As Long, p1 As Long, p2 As Long
    Dim qt As QueryTable

    Set INvaluesCell = Range("B1")

    If Not Intersect(Target, Range(INvaluesCell, "M1:M4")) Is Nothing Then

        SQLin = ""
        parts = Split(INvaluesCell.Value, ",")
        For i = 0 To UBound(parts)
            SQLin = SQLin & "'" & parts(i) & "',"
        Next
        SQLin = " IN (" & Left(SQLin, Len(SQLin) - 1) & ")"

        Set qt = Me.ListObjects(1).QueryTable

        p1 = InStr(1, qt.CommandText, " IN (", vbTextCompare)
        If p1 > 0 Then
            p2 = InStr(p1, qt.CommandText, ")") + 1
            qt.CommandText = Left(qt.CommandText, p1 - 1) & SQLin & Mid(qt.CommandText, p2)
        End If

    End If

End Sub
2021-04-15